【t084】数列

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;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626695.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值