博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod-1126 求递推序列的第N项【递推序列+模除】
阅读量:6894 次
发布时间:2019-06-27

本文共 957 字,大约阅读时间需要 3 分钟。

基准时间限制: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

问题链接

问题分析:本题与《》类似,输入的值的范围不同,参见参考链接。

这是一个有关序列与模除的问题,有点像斐波拉契数列,只是第i项是由一个公式计算的,并且使用了模除。

根据数论的知识可知,模7的余数值是0-6。若对于正整数k和m,若f(k-2)=f(m-2)且f(k-1)=f(m-1),则f(k)=f(k-2)+f(k-1)=f(m-2)+f(m-1)=f(m),即如果k和m的前两项完全相同,则f(k)=f(m)。这样的数列,若干项之后,其值会循环出现,所以不必将其所有的项都算出来,只需要算出第一个循环的各个项即可。

因此,只需要构建一个长度为n的短数列,各项的值为定义公式计算出来的7的余数,需要知道的是n为多少。如果f(n+1)=1(f(1)=1)且f(n+2)=1(f(2)=1),那么就得到了所要求的n了。

程序说明:需要取一个合适的N,保证能够出现循环。

题记:(略)

参考链接

AC的C++程序如下:

#include 
using namespace std;const int MOD = 7;const int N = 110;int t[N] = {0, 1, 1};int main(){ int a, b, n, i; while(cin >> a >> b >> n) { if(n == 1 || n == 2) { ; } else { for(i=3; i

转载于:https://www.cnblogs.com/tigerisland/p/7563727.html

你可能感兴趣的文章
新手如何快速入门Java学习?
查看>>
为什么要学习Python?
查看>>
VMWareStation 12和CentOS 6.5 三节
查看>>
关于微信小程序登陆的问题
查看>>
从零开始的linux 第六章
查看>>
ssh远程登录
查看>>
10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync
查看>>
手机web页面制作时的注意事项
查看>>
LINUX系统服务与管理(Services)---------第二天
查看>>
【Docker篇之一】Docker镜像及容器
查看>>
Linux 通过配置Cobbler服务器全自动批量安装部署
查看>>
单片机编程入门学习 这几问你能回答吗?
查看>>
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或......
查看>>
【转】[行业透视] 外企九年-我最终选择放弃
查看>>
最终目标展示:一个完善的操作系统
查看>>
opencv图像融合(给人脸添加一个眼镜)
查看>>
mysql参数优化辅助工具之tuning-primer.sh
查看>>
SpringBoot之整合MyBatis
查看>>
docker 笔记
查看>>
我的友情链接
查看>>