hdu1005-Number Sequence-(循环节)
2024-09-06 17:27:09
题意:已知f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7,给出A,B,n,求f(n)
题解:n巨大,循环肯定超时,在模7的条件下,0<=f(n)<=6,一共7种选择,则f(n-1)和f(n-2)各有7种选择,共49种组合,至少在第50个组合必定会和前面的重复,找出循环节。
坑:不知网上为什么都说找连续两个1的循环节,有大神指出这是错误的,当a和b是某两个数时,序列是1,4,6循环,但我忘记是哪两个数了,也找不到博客。
在我看来,两重循环找出相同的比较稳妥,而不是找两个1。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int a,b,n;
int f[]; int main()///hdu1005
{
while(scanf("%d %d %d",&a,&b,&n)!=EOF&&(a+b+n))
{
memset(f,,sizeof(f));
f[]=f[]=;
int i,j;
int minn=min(n,);
for(i=;i<=minn;i++)
f[i]=(a*f[i-]+b*f[i-])%; ///找第一次和第二次出现的循环节
int cha=-;
for(i=;i<=minn;i++)
{
for(j=i+;j<=minn;j++)///不吝啬这点时间找出循环节
if( f[i]==f[j] && f[i+]==f[j+] )
{
cha=j-i;///循环节的差
break;
}
if(cha!=-)
break;
}
/// 此时i是循环节的起点
int idx;
if(cha==-)///数据太少,没有找到循环节,直接求
{
idx=n;
}
else
{
n=n+cha;
idx=(n-)%cha;
if(idx==)
idx=+cha;
else
idx=+idx;
}
printf("%d\n",f[idx]);
}
return ;
}
hdu1005
最新文章
- This text field does not specify an inputType or a hint
- 推荐一个winform 界面交互类库转
- 使用BeanUtils工具类操作Java bean
- Using Pre-Form Trigger In Oracle Forms
- 解决 oracle 错误ORA-01033
- js中闭包来实现bind函数的一段代码的分析
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)
- 浅谈spring为什么推荐使用构造器注入
- 常见的web攻击手段
- Elasticsearch&#160;Search&#160;APIs
- Python测试Post请求
- 解决Ubuntu 18.04中文输入法的问题,安装搜狗拼音
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
- day3 zookeeper
- 有关Mysql的mysql_store_result函数返回NULL的情况以及其他注意事项
- iOS 批量打包
- thinkphp---设置路由
- Cocos2d-x学习笔记(十)CC_CALLBACK回调函数相关宏
- STL__容器的分类
- Developing ADF PageTemplates
热门文章
- Visual Studio 调试系列9 调试器提示和技巧
- 用欧拉计划学Rust语言(第17~21题)
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
- contentType: &#39;application/json&#39; C#后台怎么处理
- Go gRPC 调试工具
- 记一次错误排查,主要问题是跨平台文件中换行符(CRLF, LF)和垃圾字符( Caret Notation)
- Redis-2-五种基本类型及相关命令
- python爬虫—爬取英文名以及正则表达式的介绍
- spring容器的功能扩展
- 用Python爬E站本