51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目:
看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来。(虽然我WA了7次 TLE了3次,被自己蠢哭)
我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的找到循环节然后求第n项。
我们只用记录下两个连续的数字重复出现,就找到了循环节,然后就简单了。
注意:MOD函数是用于返回两数相除的余数,返回结果的符号与除数(divisor)的符号相同。(来自百度百科) ,mod结果正负所以要与7正负相同。
代码(详细注释):
#include <bits\stdc++.h>
using namespace std;
typedef long long ll; int f[]; // 存递推项。
int v[][]; // v[i][j]表示 f[k-1]和f[k]出现的位置,第二次出现就找到了循环节了。
int main() {
int a,b,n;
cin >> a >> b >> n;
int round ; // 循环节长度
f[] = f[] = ;
v[][] = ; // 1,1连续出现的位置是1
int start; // 循环节开始的位置-1。
for(int i = ;; i++){
f[i] = ((a*f[i-] + b*f[i-])%+)%; // 让f[i]变成成正数。
// cout << "i: " << i << " f: " << f[i] << endl;
if(i == n){
cout << f[i] << endl; // 如果求出循环节之前求出了答案,直接输出。
return ;
}
if(v[f[i-]][f[i]] == ){
v[f[i-]][f[i]] = i-; // f[i-1],f[i]第一次出现
}else{
// 第二次出现
round = i--v[f[i-]][f[i]]; // 循环节长度
start = v[f[i-]][f[i]]-; // 循环节开始的位置-1。
break;
}
}
n -= start; // 减去不在循环节之内的部分。
n = n % round; // 求出n在循环节中的位置。 //已知的循环节从 start+1 - start+round。
if(n == ) cout << f[start+round] << endl;
else cout << f[start+n] << endl;
return ;
}
//written by zhangjiuding.
51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释的更多相关文章
- 51nod 1126 求递推序列的第N项 && hdu - 1005 Number Sequence (求周期)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 http://acm.hdu.edu.cn/showproblem ...
- 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 输 ...
- 51nod 1126 求递推序列的第N项
1126 求递推序列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f( ...
- 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)的 ...
- 51nod 1126 - 求递推序列的第N项 - [找规律]
题目链接:https://cn.vjudge.net/problem/51Nod-1126 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + ...
- 51Nod 1126 求递推序列的第N项(矩阵快速幂)
#include <iostream> #include <algorithm> #include <cmath> #define MOD 7 #define N ...
- [51nod 1126] 求递推序列的第N项 - 矩阵乘法
#include <bits/stdc++.h> using namespace std; #define int long long const int mod = 7; struct ...
- 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 输 ...
- [51NOD1126]求递推序列的第n项(矩阵快速幂)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1126 存在参数a,b为负数的情况.这时候要这么处理: 根据mo ...
随机推荐
- SVG文本
前面的话 本文将详细介绍SVG文本相关内容 位置属性 在一个SVG文档中,使用<text>元素来设置文本,<text>元素有x.y.dx.dy这四个位置属性 [x和y] 属性x ...
- 7-zip 解压
7-zip 解压 1.引入依赖文件 sevenzipjbinding.jar sevenzipjbinding-Allwindows.jar <!-- https://mvnrepository ...
- Day2 - Linux发展史
第1章 Linux发展史 1.1 什么是操作系统 操作系统是人与计算机硬件的一个中介. 1.2 操作系统组成 操作系统类似与鸡蛋 蛋壳--------->系统中各种各样的软件 蛋清------- ...
- 如何搭建Zookeeper集群
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的 ...
- HTML的基本标签
整理一下这一周学习的一些知识. 首先是一些基本标签. <!DOCTYPE HTML><html> 文档类型声明: 让浏览器,按照html5的标准对代码进行解释与执行.文档类型声 ...
- 深入理解计算机系统(2.3)------布尔代数以及C语言运算符
本篇博客我们主要讲解计算机中的布尔代数以及C语言的几个运算符. 1.布尔代数 我们知道二进制值是计算机编码.存储和操作信息的核心,随着计算机的发展,围绕数值0和1的研究已经演化出了丰富的数学知识体系. ...
- javascript中=,==,与===的区别;以及特殊值NaN的讲解
1.在js中"="是作为赋值.var a; a=3:给a赋值为3. 2."=="称作相等,"==="被称作严格相等.当使用"== ...
- Mac上好用的视频播放器有哪些?
首页发现话题 提问 登录加入知乎 Mac 上好用的视频播放器有哪些? 关注问题写回答 OS X 应用 多媒体播放器(软件) Mac 上好用的视频播放器有哪些? 关注者 2680 被浏览 981770 ...
- 集美大学网络1413第十次作业成绩(团队六) -- 展示博客(Alpha版本)
题目 团队作业6--展示博客(Alpha版本) 团队作业6成绩 团队/分值 简介& 项目地址 项目目标 (典型用户. 功能描述. 预期用户数量) 如何满足 用户需求 已完成目标 团队分工 团 ...
- 团队作业4——第一次项目冲刺 SiStH DaY
项目冲刺--??? 你以为penta kill以后就没事了嘛,就没得写了吗?你还期待我会给你一个六杀?七杀?别逗了,你以为你玩三国杀呢,做项目这么严肃的事情,怎么能玩笑. 那么我就在这里明明白白地告诉 ...