hello kity
期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读
分类
最新评论
最新留言
链接
RSS
计数器
223173
功能
HDU 1055(Number Sequence) 典型的找循环节的题目!
spoiler
posted @ 2011年4月19日 05:11
in 规律及递归经典题
, 2533 阅读
题目:
Problem Description
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).
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.
题目分析:
这种题目第一次做,学会了 什么时候找循环节!因为这种题目,数据量那么大 ,肯定有循环节的!
这里我就是以找到与第1个跟第2个等的两个数作为一个循环节!因为每个数都是由前面两个数决定的!所以循环节要找到第一对 与第1个与第2个匹配的!
代码:
#include<iostream> #include<cstdio> using namespace std; int f[1009]; int main(){ int a,b,n,i,c; f[1]=f[2]=1; while(scanf("%d%d%d",&a,&b,&n),a || b || n){ for(i=3;i<50;i++){ f[i]=(a*f[i-1]+b*f[i-2])%7; if(f[i]==1&&f[i-1]==1) break; } c=i-2; n=n%c; if(n==0) printf("%d\n",f[c]); else printf("%d\n",f[n]); } return 0; }
2012年8月25日 19:09
囧...是1005