lightoj1070
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "); 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 }
以上是关于lightoj1070的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1070 Algebraic Problem (推导+矩阵高速幂)