lightoj1070

题意:给出a+b和a*b还有n的值,要你求a^n+b^n  mod2^64的值!

主要是公式的得出,把(a^(n-1)+b^(n-1))(a+b)拆分出来就可以得到这个值:

加下来是代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned long long ll;
 4 ll a,b,n;
 5 ll lc[3][3],ans[3][3];
 6 int t;
 7 
 8 void init(){
 9     lc[1][1]=a;lc[1][2]=-b;
10     lc[2][1]=1;lc[2][2]=0;
11     ans[1][1]=a*a-2*b;ans[2][1]=a;
12 }
13 
14 void mul(){
15     ll tmp[3][3];
16     memset(tmp,0,sizeof(tmp));
17     for(int i=1;i<=2;i++){
18         for(int j=1;j<=1;j++){
19             for(int k=1;k<=2;k++){
20                 tmp[i][j]=(tmp[i][j]+lc[i][k]*ans[k][j]);
21             }
22         }
23     }
24     for(int i=1;i<=2;i++) ans[i][1]=tmp[i][1];    
25 }
26 
27 void add(){
28     ll tmp[3][3];
29     memset(tmp,0,sizeof(tmp));
30     for(int i=1;i<=2;i++){
31         for(int j=1;j<=2;j++){
32             for(int k=1;k<=2;k++){
33                 tmp[i][j]=(tmp[i][j]+lc[i][k]*lc[k][j]);
34             }
35         }
36     }
37     for(int i=1;i<=2;i++)
38         for(int j=1;j<=2;j++)
39             lc[i][j]=tmp[i][j];
40 }
41 
42 void fast_pow(ll k){
43     while(k){
44         if(k%2==1) mul();
45         add();
46         k=k/2;
47     }
48     cout<<ans[1][1]<<endl;    
49 }
50 
51 int main(){
52     cin>>t;
53     for(int kase=1;kase<=t;kase++){
54         cin>>a>>b>>n;
55         cout<<"Case "<<kase<<": ";
56         if(n==0) printf("2\n");
57         else if(n==1) cout<<a<<endl;
58         else if(n==2) cout<<a*a-2*b<<endl;
59         else{
60             init();
61             fast_pow(n-2);
62         }
63     }
64     return 0;
65 }
View Code

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9961065.html