【HDU 1005】Number Sequence —— 找周期

原题链接

Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 122213    Accepted Submission(s): 29653

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

解题报告:

一开始做这题就是想暴力求解,所以如期的TLE了。然后换个思路,直接算出了通项公式,但是通项公式有两项都是带根号的,最后不能很好的转换为int,放弃!再接着,瞥了下discuss里面的讨论,得到的关键字是周期,其实也很容易想到,毕竟是mod 7,很快就应该有周期,所以只需要找到周期就好。注意!!!但是由于f(1)=f(2)=1是初始项,并不一定满足通项的结构,所以应该从f(3)开始匹配找周期!更详细的解释请移步:[ACM_HDU_1005]Number
Sequence

当然,这题还有另外的解法,详见 【HDU1005】Number Sequence(矩阵乘法)

#include <iostream>
using namespace std;
int a,b,n;
int A[100];
int main()
{
    while(cin>>a>>b>>n){
        if(!a && !b && !n) break;
        if(n==1 || n==2) cout<<1<<endl;
        else{
            A[1]=A[2]=1;int cyc=n;
            for(int i=3;i<=100;++i){
                A[i]=(a*A[i-1]+b*A[i-2])%7;
                if(i>5 &&  A[i]==A[4] && A[i-1]==A[3]){cyc=i-4;break;}
            }

            //输出
            cout<<A[(n-3)%cyc+3]<<endl;
        }
    }
    return 0;
}
时间: 2024-11-04 19:53:55

【HDU 1005】Number Sequence —— 找周期的相关文章

51nod 1126 求递推序列的第N项 &amp;&amp; hdu - 1005 Number Sequence (求周期)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 http://acm.hdu.edu.cn/showproblem.php?pid=1005 注意上面一题和下面一题的区别,上面A,B可能取负数,但是mod跟c++中%是不一样的,mod只会得到非负数,两次跳进这个坑了. 然后就找周期,只要f[i-1]==1&&f[i]==1就可以跳出,然后i-2就是周期,输出n%(i-2)的时候,要注意如果等于0的话,其实

HDU 1005 Number Sequence (数学规律)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 104190    Accepted Submission(s): 25232 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

HDU 1005 Number Sequence(数论)

HDU 1005 Number Sequence(数论) 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

HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 175657    Accepted Submission(s): 43409 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

HDU 1005 Number Sequence(数列)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) [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

HDU 1005 Number Sequence 数学

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 cont

HDU 1005 Number Sequence 矩阵快速幂

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 236241    Accepted Submission(s): 60070 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

找规律/hdu 1005 Number Sequence

题意 给出a,b,n,已知f[1]=f[2]=1,f[i]=(a*f[i-1]+b*f[i-2]) mod 7 输出f[n] 数据范围 1 <= A, B <= 1000, 1 <= n <= 100,000,000 分析 首先,直接求..肯定是不行的 会tle 会mle 但是可以找到规律,例如对a=1,b=1 这个数据,有 f1=1 f2=1 f3=3 f4=5 f5=4 f6=0 f7=1 f8=1 f9=3 f10=5 f11=4 f12=0 ???? 我们会发现有一定的规律

NYOJ 427 &amp; HDU 1005 Number Sequence(找循环节)

[题目链接]click here~~ [题目大意]已经 f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.求f(n), [解题思路]:此题是大三届的一场比赛题,前几天做了下,结果是不忍直视啊,wa了几乎一页了,最开始想的是用矩阵快速幂,但是想了想,取模数才不到10,7 7=49,也就是说最大结果不超过49种可能,直接模拟递推式试试,结果发现不行,后来想到了用循环节,不难想到: 如果结果有两个答案连着 =1,则后面的全部和