【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;}
- 【t084】数列
- 数列
- 数列
- 数列
- 数列!!!
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- 数列
- LightOJ-1364 Expected Cards(期望dp)
- 使用OD从零开始Cracking
- Codeforces Round #393 Pavel and barbecue
- Mac使用Cocos2.2.6的最低配置
- 使用BOOL变量犯过的错误
- 【t084】数列
- 算法之路二:刘汝佳算法竞赛入门经典:c++结构体
- 克鲁斯卡尔算法:蓝桥杯 算法训练 安慰奶牛 (最小生成树)
- 流媒体协议—HLS
- 从任正菲“打港办”收编干儿子李一男的十大手法,看华为2017年春节前起诉6名前员工!
- 【颓废篇】easyx--2048
- 关于tomcat
- perl post模拟elasticsearch _mget
- SpringMVC框架的搭建(非注解形式)