51nod 1126 - 求递推序列的第N项 - [找规律]

题目链接:https://cn.vjudge.net/problem/51Nod-1126

有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
 

Input输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)Output输出f(n)的值。Sample Input

3 -1 5

Sample Output

6

 

题解:

一看是mod 7的,显然f[i]是有循环节规律的,我们找出循环节长度即可。

 

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int f[maxn];
int vis[8][8][8],len;
int A,B,n;
int main()
{
    scanf("%d%d%d",&A,&B,&n);

    memset(vis,0,sizeof(vis));
    f[1]=f[2]=1;
    for(int i=3;;i++)
    {
        f[i]=((A*f[i-1]+B*f[i-2])%7+7)%7;
        if(i==n)
        {
            cout<<f[i]<<endl;
            return 0;
        }

        if( !vis[ f[i-2] ][ f[i-1] ][ f[i] ] )
        {
            vis[ f[i-2] ][ f[i-1] ][ f[i] ] = i;
        }
        else
        {
            len=i-vis[ f[i-2] ][ f[i-1] ][ f[i] ];
            break;
        }
    }
    if(n%len==0) cout<<f[len]<<endl;
    else cout<<f[n%len]<<endl;
}

PS.需要注意这里的取模运算与C的%的一定的区别:http://www.cnblogs.com/dilthey/p/8306069.html

posted @ 2018-01-17 22:04  Dilthey  阅读(415)  评论(0编辑  收藏  举报