hdoj1005(循环,找规律)
Problem Description
A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5
1.看到题目第一反应就是用一个函数,用递归求出结果。但感觉这样做太简单了,想到这是个水题,就这么做了,下面是代码。果不其然,TML!!
#include<stdio.h>
int f(int a1,int b1,int n1){
if(n1==1||n1==2)return 1;
else
return (a1*f(a1,b1,n1-1)+b1*f(a1,b1,n1-2))%7;
}
int main(){
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n)==3&&n) //n为0时结束
printf("%d\n",f(a,b,n));
return 0;
}
2.想了很久,想不明白,就去网上看别人的博客。网上的答案实在是参差不齐,但还是慢慢有了思路。
3.首先,因为题目中的f[n]最后是对7取余,故其结果只可能有7个(0~6),所以这道题应该是让大家找规律,找到循环周期,又因为当a,b确定时,f[n]只由f[n-1],f[n-2]决定,而f[n-1],f[n-2]的取值各只有7个,所以最多有49种情况。故周期大小一定<=49。但还有一个很重要的地方就是要注意可能出现循环起点不一定在f[0],f[1],可能先是一段序列,之后才开始循环(但似乎杭电服务器上关于本题的测试数据是不完整的,所以网上很多人把1,1当作循环起始点时也AC了,还是要注意)。之后就是找到循环起始点以及循环长度了。思路是从i=2开始计算f[i],并令j=i-1;j>0;j++。判断是否f[i]==f[j]&&f[i-1]==f[j-1]?从而找到start,len。然后可将n(>start)对应到区间[start,start+len-1]上来,就可以得到f[n]了。
最后,提醒一下注意n到底是数组下标还是数组中的第n个,题目给的是求第n个。我就在这折腾了一个小时,debug半天才发现......
下面是AC代码:
#include<stdio.h>
int main(){
int a,b,n,start,len; //start为循环起点,len为循环长度
while(scanf("%d%d%d",&a,&b,&n)==3&&(a||b||n)){ //a,b,n同时为0时退出循环
n--; //将n变成数组下标
start=len=0;
int f[51]={1,1}; //保存前51项的数组
for(int i=2;i<51;i++){
f[i]=(a*f[i-1]+b*f[i-2])%7; //计算m[i]
for(int j=i-1;j>0;j--){ //从i-1往前找j,使得m[i]==m[j]&&m[i-1]==m[j-1],从而确定循环起点以及循环长度
if(f[i]==f[j]&&f[i-1]==f[j-1]){
start=j-1;
len=i-j;
break;
}
}
if(len>0) //当第一次找到start,len之后退出循环
break;
}
if(n<start)
printf("%d\n",f[n]);
else
printf("%d\n",f[start+(n-start)%len]);
}
return 0;
}
体会:学到了遇到数列题目时要想想里面是不是存在周期现象,发觉里面的规律,之后解题就容易了。
hdoj1005(循环,找规律)的更多相关文章
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- A Simple Problem with Integers 循环节 修改 平方 找规律 线段树
A Simple Problem with Integers 这个题目首先要打表找规律,这个对2018取模最后都会进入一个循环节,这个循环节的打表要用到龟兔赛跑. 龟兔赛跑算法 floyed判环算法 ...
- hdu4952 Number Transformation (找规律)
2014多校 第八题 1008 2014 Multi-University Training Contest 8 4952 Number Transformation Number Transform ...
- HDU1005Number Sequence(找规律)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- LightOj 1245 --- Harmonic Number (II)找规律
题目链接:http://lightoj.com/volume_showproblem.php?problem=1245 题意就是求 n/i (1<=i<=n) 的取整的和这就是到找规律的题 ...
- hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)
题目 第一次做是看了大牛的找规律结果,如下: //显然我看了答案,循环节点是48,但是为什么是48,据说是高手打表出来的 #include<stdio.h> int main() { ], ...
- zoj 3785 What day is that day? (打表找规律)
题目 思路:比赛的时候有想过找循环节,但是,打表打错了. 后来,看着过了挺多人,就急了, 看了一下别人的时间 耗时都挺长的,就以为不是找规律, 没想到真是找规律,不过,这个题的数据可能挺大的. AC代 ...
- 【数论,找规律】Uva 11526 - H(n)
原来做过的题再看还是没想出来,看来当时必然没有真正理解.这次回顾感觉理解更透彻了. 网上的题解差不多都是一个版本,而且感觉有点扯.根据n=20猜出来的? 好吧哪能根据一个就猜到那么变态的公式.其实这题 ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
随机推荐
- USB之HID类Set_Report Request[调试手记1]
请翻开<Device Class Definition for Human Interface Devices (HID) Version 1.11 >7.2.2 Set_Report R ...
- 在ls命令中使用通配符
通配符比较简单.我们已经知道通配符常常是在shell终端中用来匹配文件名的,今天来看一下在ls命令中使用通配符的例子. 用法:ls [选项]... [文件]... ls本身也有很多的选项,我们今天不看 ...
- Java安全编码标准
Java安全编码标准 具体参考Rules 输入验证和数据净化(IDS)规则风险评估概要 IDS00-J净化穿越受信边界的非受信数据 IDS01-J验证前标准化字符串 IDS02-J在验证之前标准化路径 ...
- 【JEECG技术文档】JEECG部门管理员操作手册
功能介绍 使用部门管理员设置需要完成以下步骤: 1. 在“部门管理员设置”菜单配置权限以及分配管理员. 2. 在“部门角色管理”菜单配置角色,以及权限. 3. 在“部门用户角色授权”菜单分配角色到哪个 ...
- (转载)Android下Affinities和Task
源文链接:http://appmem.com/archives/405 1.Activity和Task task就好像是能包含很多activity的栈. 默认情况下,一个activity启动另外一个a ...
- 自动配置IE代理脚本
http://www.cnblogs.com/ttyp/archive/2005/11/18/279124.html
- Linux主机如何用ssh去登录docker容器的步骤
进入终端,sudo -i,切换root,输入docker -d 打开另一个终端,切换root,输入docker search ubuntu,大概如下结果: NAME ...
- Linux crontab使用方法
crontab命令主要用于设置命令行或者脚本周期性的执行.该命令从标准输入设备读取指令,并将其存放于文件中,以供之后读取和执行.本文主要讲述crontb命令的基本语法和配置方法. 1.crontab命 ...
- c语言基本数据类型及存储方式
; ; ; ; ; ; ; ; float a9 = 109.23; float a10 = 111.23; double a11 = 113.113; double a12 = 115.113; c ...
- ServiceWorker和WebWorker
在google打上关键字 service worker 空格进行搜索 参考地址 (Web_worker)[https://en.wikipedia.org/wiki/Web_worker] (serv ...