码迷,mamicode.com
首页 > 其他好文 > 详细

lightoj1070

时间:2018-11-15 00:12:13      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:mod   class   fast   div   opened   style   bit   play   \n   

题意:给出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

 

lightoj1070

标签:mod   class   fast   div   opened   style   bit   play   \n   

原文地址:https://www.cnblogs.com/pandaking/p/9961065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!