【t084】数列

来源:互联网 发布:学生请假软件 编辑:程序博客网 时间:2024/04/30 15:54

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7。给定A,B和n的值,要求计算f(n)的
值。
说明:若输入样例为1 2 10,则输出为5。
【数据规模】
20%的数据,n≤1,000
40%的数据,n≤100,000
100%的数据,n≤100,000,000
【输入格式】

输入文件(sequence.in)仅一行包含3个整数A,B和n,其中(1≤ A, B ≤1000, 1 ≤n≤100,000,000)。

【输出格式】

输出文件(sequence.out)仅一行,一个整数,即f(n)的值。

Sample Input

1 1 3
Sample Output

2

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t084

【题解】

考虑f[i-1]和f[i]
f[i-1]有7种可能,f[i]也有7种可能;
而一旦出现了{f[i-1],f[i]}这样的有序对,之前出现过的情况;
那么就出现了循环节.(因为f[i-1],f[i]和之前的某一刻相同了,那么f[i+1]肯定也和前面的某一刻相同.至此变成循环的了);
大概是某种理论什么的吧.
最后一定又会出现{f[i-1],f[i]}={1,1}的情况;
那么处理出这个循环节即1..i-2为一个循环;
最后取模输出一下就好;
(也比较好想到和循环节有关啦)
(只是最后一定都能得到{1,1}吗,有没有可能最后到了另外一个循环节里面?)
(是不是和AX+BY这种变化本身有关,是线性的,所以最后又能回来?)

【完整代码】

#include <cstdio>#define rep1(i,x,y) for (int i = x;i <= y;i++)#define rei(x) scanf("%d",&x)int n,a,b,r =0;int f[100000];int main(){    rei(a);rei(b);rei(n);    f[1] = 1;f[2] = 1;    rep1(i,3,50000)    {        f[i] = (a*f[i-1]+b*f[i-2])%7;        if (f[i]==1 && f[i-1]==1)        {            r = i-2;            break;        }    }    f[0] = f[r];    printf("%d\n",f[n%r]);    return 0;}
0 0
原创粉丝点击