基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
 收藏
 关注
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input
输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)
Output
输出f(n)的值。
Input示例
3 -1 5
Output示例
6

找规律的题

#include <bits\stdc++.h>
using namespace std;
typedef long long ll; int f[10000]; // 存递推项。
int v[10][10]; // v[i][j]表示 f[k-1]和f[k]出现的位置,第二次出现就找到了循环节了。
int main() {
int a,b,n;
cin >> a >> b >> n;
int round ; // 循环节长度
f[1] = f[2] = 1;
v[1][1] = 1; // 1,1连续出现的位置是1
int start; // 循环节开始的位置-1。
for(int i = 3;; i++){
f[i] = ((a*f[i-1] + b*f[i-2])%7+7)%7; // 让f[i]变成成正数。
// cout << "i: " << i << " f: " << f[i] << endl;
if(i == n){
cout << f[i] << endl; // 如果求出循环节之前求出了答案,直接输出。
return 0;
}
if(v[f[i-1]][f[i]] == 0){
v[f[i-1]][f[i]] = i-1; // f[i-1],f[i]第一次出现
}else{
// 第二次出现
round = i-1-v[f[i-1]][f[i]]; // 循环节长度
start = v[f[i-1]][f[i]]-1; // 循环节开始的位置-1。
break;
}
}
n -= start; // 减去不在循环节之内的部分。
n = n % round; // 求出n在循环节中的位置。 //已知的循环节从 start+1 - start+round。
if(n == 0) cout << f[start+round] << endl;
else cout << f[start+n] << endl;
return 0;
}

51nod 1126 求递推序列的第N项的更多相关文章

  1. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  2. 51nod 1126 - 求递推序列的第N项 - [找规律]

    题目链接:https://cn.vjudge.net/problem/51Nod-1126 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...

  3. 51nod 1126 求递推序列的第N项 && hdu - 1005 Number Sequence (求周期)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 http://acm.hdu.edu.cn/showproblem ...

  4. 51Nod 1126 求递推序列的第N项(矩阵快速幂)

    #include <iostream> #include <algorithm> #include <cmath> #define MOD 7 #define N ...

  5. [51nod 1126] 求递推序列的第N项 - 矩阵乘法

    #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 7; struct ...

  6. 515Nod 1126 求递推序列的第n项【矩阵快速幂】

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

  7. 51nod1126 求递推序列的第N项

    求递推序列的第N项 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的 ...

  8. [51NOD1126]求递推序列的第n项(矩阵快速幂)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 存在参数a,b为负数的情况.这时候要这么处理: 根据mo ...

  9. 51nod1126 求递推序列的第N项【递推】

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

随机推荐

  1. ThoughtWorks技术雷达

    ThoughtWorks技术雷达 技术成熟方案的一个推荐网站.

  2. CentOS 7下安装Logstash ELK Stack 日志管理系统(上)

    介绍 The Elastic Stack - 它不是一个软件,而是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来源,任 ...

  3. 机器学习技法总结(五)Adaptive Boosting, AdaBoost-Stump,决策树

    上一讲主要利用不同模型计算出来的g.採用aggregation来实现更好的g.假设还没有做出来g.我们能够採用bootstrap的方法来做出一系列的"diversity"的data ...

  4. sdk manager 创建的虚拟机启动的时候总是在Android字样解决

    一直显示Android字样.仅仅须要删除文件夹下的snapshots.img 找到sdk的文件夹下的\tools\lib\emulator,然后删除上面的文件snapshots.img就可以,我的sd ...

  5. 【Mongodb教程 第三课 】MongoDB 删除数据库

    dropDatabase() 方法 MongoDB db.dropDatabase() 命令是用来删除一个现有的数据库. 语法: dropDatabase() 命令的基本语法如下: db.dropDa ...

  6. Visual Studio Code 常用插件

    这里记录在Visual Studio Code中,我经常用到的插件. C#这个就不必说了,想用VIsual Studio Code调试和编辑C#代码,必须要装这个插件.东西还好,就是每次安装和更新插件 ...

  7. ffmpeg转码本地文件(一)

    ffmpeg转码本地文件(一) 实现目标:输入本地文件.实现本地文件转码,里面包括mux层转码,codec层转码,视频格式转换,音频重採样等功能,功能点请看凝视.注意:凝视非常重要. #ifndef ...

  8. oracle 10g的备份和还原

    采用 expdp备份,impdp还原. 注意这二者不等同于exp和imp.oracle 10g以前,可以采用exp.imp,10g及以后,expdp + impdp矣.据说10g里面,如果采用exp, ...

  9. transport transmission

    运输层 transport layer 传输控制协议 transmission control protocol

  10. Spring简单实现数据源的动态切换

    Spring简单实现数据源的动态切换: 1. 创建一个数据源切换类: 2. 继承AbstractRoutingDataSource,创建多数据源路由类,并注入到spring的配置文件中: 3. AOP ...