NYOJ 427 递推题

来源:互联网 发布:网络活动策划方案 编辑:程序博客网 时间:2024/06/03 05:37

   这道题是昨天月赛的题目,月赛时纠结了1个多小时,今天又纠结了一个多小时,,,悲剧。昨天主要犯的错误时不知道循环可以不从0开始,就这样一直纠结到比赛结束。今天主要纠结在把++j写成了++i,,卧槽,这种错误真TMD的难发现。。。改过后就ac了。题目:

Number Sequence

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
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).
输入
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.
输出
For each test case, print the value of f(n) on a single line.
样例输入
1 1 31 2 100 0 0
样例输出
25
ac代码:

 #include <iostream>#include <string.h>#include <cstdio>using namespace std;int f[55],p[7][7];int main(){  f[1]=1;f[2]=1;  int a,b,n;  while(scanf("%d%d%d",&a,&b,&n),a,b,n){    memset(p,0,sizeof(p));p[1][1]=1;f[1]=1;f[2]=1;int i;for(i=3;i<=51;++i){  f[i]=(a*f[i-1]+b*f[i-2])%7;  if(p[f[i-1]][f[i]]==1)  break;  p[f[i-1]][f[i]]=1;}int j;for(j=1;j<=i-2;++j){  if(f[j]==f[i-1]&&f[j+1]==f[i])  break;}if(n<j)printf("%d\n",f[n]);else{  int k;  k=i-1-j;  f[0]=f[i-2];  n-=(j-1);  int xx=n%k;  if(xx){printf("%d\n",f[j-1+(n%k)]);}  else{printf("%d\n",f[0]);}}  }  return 0;}        


原创粉丝点击