HDOJ 1005 Number Sequence
2016-02-11 15:55
435 查看
Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 141961 Accepted Submission(s): 34496
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).
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 3 1 2 10 0 0 0
Sample Output
2 5
Author
CHEN, Shunbao
Source
ZJCPC2004
此题的数据较大,显然暴力解出来是不可能的,肯定是需要我去寻找规律,找出是否存在循环节。
首先这题是对7取余,取余数的结果只有7种,0~6。首先f(n) = (A * f(n - 1) + B * f(n - 2))%7,我们对这个式子进行一下化简,可以得到f(n) = (A%7 * f(n - 1)%7 + B%7 * f(n - 2)%7) % 7,又因为对7取余的结果只有0~6这7种,所以f(n-1),f(n-2)只有7*7=49种结果,所以在进行49次之后肯定会出现周期,找到周期后只需要求出在循环节中的位置即可。
#include <stdio.h> int main() { int i,n,A,B; int f[50],num; while(scanf("%d%d%d",&A,&B,&n)!=EOF&&(A||B||n)) { f[1]=1; f[2]=1; for(i=3;i<=49;i++) { f[i]=(A*f[i-1]+B*f[i-2])%7; if(f[i]==f[i-1]&&f[i]==1) //判断是否出现周期 break; } num=i-2; n=n%num; if(n==0) printf("%d\n",f[num]); else printf("%d\n",f ); } return 0; }
相关文章推荐
- AbstractQueuedSynchronizer(AQS)
- poj_1458 Common Subsequence(最长公共子序列)
- Codeforces 622A Infinite Sequence
- windowbuilder01 按钮事件监听
- Educational Codeforces Round 7--A. Infinite Sequence
- UIScrollView常见功能(scrollView里子控件悬停)
- 最新 Sublime Text3 激活码 (Build 3103 有效)
- pyhon3.4 requests模块模拟post登陆csdn
- hdu3998Sequence【最长递增子序列及方法数】
- 关于AlertDialog.Builder的传参
- codeforces 622A A. Infinite Sequence (二分)
- 安卓Notification.Builder的使用
- iOS --- 本地推送通知 UILocalNotification
- UVa 133 The Dole Queue
- String、StringBuffer与StringBuilder之间区别
- UI控件(UISegmentedControl)
- UVA 12100 Printer Queue
- UVA 1594 Ducci Sequence
- 1017. Queueing at Bank (25)
- Android开发学习之路--UI之ListView