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;
    }
  • 相关阅读:
    中国的南方人和北方人有什么区别?总算说透了!
    怎样通过穴位按摩来减轻脚踝扭伤的疼痛
    关于脚踝不得不说的各种事
    电影发烧友必备知识-720P、1080P、4K的区别
    有什么相见恨晚的小知识?
    男生有钱到底有多重要?
    es6学习笔记5--promise
    es6学习笔记4--数组
    js设计模式总结1
    es6学习笔记3--解构和对象
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626695.html
Copyright © 2011-2022 走看看