求助
查看原帖
求助
169555
Kiloio楼主2021/2/23 11:53

wa了一个点(第二个),t了一个点(第十个)

#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long n,op[3],a[3],arr[3][3],ans[3][3],z[3][3];
void sum_1(){
    memset(z,0,sizeof(z));
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	for(int k=1; k<=2; k++){
            	z[i][j]=(z[i][j]+(ans[i][k]*arr[k][j])%mod)%mod;
			}
		}
	}                                  
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	ans[i][j]=z[i][j];
		}
	}                
}
void sum_2(){
    memset(z,0,sizeof(z));
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	for(int k=1; k<=2; k++){
            	z[i][j]=(z[i][j]+(arr[i][k]*arr[k][j])%mod)%mod;
			}
		}
	}                                  
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	arr[i][j]=z[i][j];
		}
	} 
}
int ksm(int n){
	while(n>0){      
        if(n&1){
           	sum_1();
		}
        n>>=1;
        sum_2();
    }
}
int main(){
    cin>>n;
    if(n==0){
    	cout<<0;
    	return 0;
	}
    if(n==2 || n==1){
    	cout<<1;
    	return 0;
	}
    a[1]=a[2]=1;
    for(int i=1; i<=2; i++){
    	ans[i][i]=1;
	}      
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	arr[i][j]=1;
		}
	}       
    arr[1][1]=0;
    n-=2;
    ksm(n);
    for(int i=1; i<=2; i++){
    	for(int j=1; j<=2; j++){
        	op[i]=(op[i]+(ans[i][j]*a[j])%mod)%mod;
		}
	}                  
    cout<<op[2];
    return 0;
}
2021/2/23 11:53
加载中...