1. 程式人生 > >HDU 1005 Number Sequence(找規律,思維)

HDU 1005 Number Sequence(找規律,思維)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 153140    Accepted Submission(s): 37338

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
Recommend JGShining   |   We have carefully selected several similar problems for you:  
1019
 1071 1006 1007 1013 

題意:

給定 a,b,n 求出 f(n) 的值,題設條件 f(1),f(2)已知。

思路:

看到 n 值那麼大,用遞迴沒可能了,找規律: f(n)的取值一共有七種,無論 a,b 的取值是多少,均不下於  0,1,2,3,4,5,6  ,存在迴圈週期的節點,

找迴圈的節點就行了。

迴圈開到100就超時了,最後看的題解,開到了50。(49也行)

程式碼:

#include<stdio.h>
#define MYDD 1103

int main() {
	int a,b,n;
	int f[64];
	while(scanf("%d%d%d",&a,&b,&n)&&(a||b||n)) {
		int flag,j;//flag 記錄結束標誌
		f[1]=f[2]=1;
		for(j=3; j<=7*7+1; j++) {
			f[j]=(a*f[j-1]+b*f[j-2])%7;
			if(f[j]==1&&f[j-1]==1) {
				break;
			}
		}
		flag=j-2;//記錄迴圈的開始節點
		f[0]=f[flag];//餘數為 0 時
		printf("%d\n",f[n%flag]);
	}
	return 0;
}

後:

思維是什麼?

************************************