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

HDU - 1005 Number Sequence(简单矩阵快速幂)

时间:2017-04-25 23:24:29      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:string   break   while   tar   pre   clu   ast   href   pid   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

题意:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

就是这道题目,然而找了一晚上的错误 \("▔□▔)/\("▔□▔)/\("▔□▔)/。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 struct matrix{
 6     int m[2][2];    
 7 }ans,base;
 8 
 9 matrix multi(matrix a,matrix b){
10     matrix temp;
11     memset(temp.m,0,sizeof(temp.m));
12     for(int i=0;i<2;i++){
13         for(int j=0;j<2;j++){
14             for(int k=0;k<2;k++){
15                 temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%7;
16             }
17         }
18     }    
19     return temp;
20 }
21 
22 int fast_mod(int a,int b,int n){
23     base.m[0][0]=a;base.m[0][1]=b;base.m[1][0]=1;base.m[1][1]=0;
24     ans.m[0][0]=ans.m[1][1]=1;
25     ans.m[0][1]=ans.m[1][0]=0;
26     while(n>0){
27         if(n&1) ans=multi(ans,base);
28         base=multi(base,base);
29         n>>=1;
30     }
31     return (ans.m[0][0]+ans.m[0][1])%7;
32 }
33 
34 int main(){
35     int a,b,n;
36     while(cin>>a>>b>>n){
37         if(a==0&&b==0&&n==0) break;
38         if(n==1||n==2) cout<<1<<endl;
39         else cout<<fast_mod(a,b,n-2)<<endl;
40     }
41     return 0;
42 }

 

HDU - 1005 Number Sequence(简单矩阵快速幂)

标签:string   break   while   tar   pre   clu   ast   href   pid   

原文地址:http://www.cnblogs.com/Leonard-/p/6764830.html

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