zoukankan      html  css  js  c++  java
  • 【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
    ",f[n%r]);
        return 0;
    }
  • 相关阅读:
    LIB和 DLL区别
    C++ STL总结
    浅谈static和extern关系
    死锁及处理
    函数模板与模板函数
    Linux无法启动httpd_正在启动httpd
    httpd不允许远程连接问题
    虚拟机UUIDexist_更改UUID
    MySQL远程连接丢失问题
    Apache服务端允许跨域
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626695.html
Copyright © 2011-2022 走看看