HDU 1005

来源:互联网 发布:mac粉底液怎么样 编辑:程序博客网 时间:2024/06/05 09:01
A number sequence is defined as follows: 

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

Given A, B, and n, you are to calculate the value of f(n). 
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed. 
Output
For each test case, print the value of f(n) on a single line. 
Sample Input
1 1 31 2 100 0 0
Sample Output
2

5

法一:想到的为矩阵快速幂求斐波那契数列

#include <cstdio>#include <cstring>#include <iostream>using namespace std;struct node{int mat[2][2];};struct node Cal(struct node a,struct node b){struct node te;memset(te.mat,0,sizeof(te.mat));for(int i=0;i<2;i++){for(int j=0;j<2;j++){if(a.mat[i][j]){for(int t=0;t<2;t++){te.mat[i][t]=(te.mat[i][t]+a.mat[i][j]*b.mat[j][t])%7;}}}}return te;}struct node Quick(struct node a,int n){if(n==1){return a;}struct node e;memset(e.mat,0,sizeof(e.mat));for(int i=0;i<2;i++){e.mat[i][i]=1;}if(n==0){return e;}while(n){if(n&1){e=Cal(a,e);}a=Cal(a,a);n=n>>1;}return e;}int main(){int a,b,n;struct node re;while(scanf("%d%d%d",&a,&b,&n)!=EOF){if(!a&&!b&&!n){break;}re.mat[0][0]=0;re.mat[0][1]=1;re.mat[1][0]=b;re.mat[1][1]=a;re=Quick(re,n-1);cout<<(re.mat[0][0]+re.mat[0][1])%7<<endl;}return 0;}

//法二:思维,试着去找循环节

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int main(){int i,a,b,n,cot;int f[10000];while(scanf("%d%d%d",&a,&b,&n)!=EOF&&a&&b&&n){f[1]=f[2]=1;for(i=3;i<10000;i++){f[i]=(a*f[i-1]+b*f[i-2])%7;if(f[i]==1&&f[i-1]==1){break;}}cot=i-2;f[0]=f[cot];cout<<f[n%cot]%7<<endl;}return 0;}

1 0
原创粉丝点击