HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】
Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 175657 Accepted Submission(s): 43409
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 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.
(⊙o⊙)…看了下题目才知道,数字范围很大,就算不是这个错误也会T了QAQ,看了下网上的这种解法,以48为周期的解法,其实大于48的整数都可以!
#include <bits/stdc++.h>
using namespace std;
int f[];
int main()
{
int a,b,n;
f[]=;
f[]=;
while(scanf("%d%d%d",&a,&b,&n)&&a&&b&&n)
{
int T=;
for(int i=;i<=;i++)
f[i]=(a*f[i-]+b*f[i-])%;
cout<<f[n%]<<endl;
}
}
但是,但是,,,,,,这种解法是存在问题的,我以51为周期也会过,只能说后台数据太水了,随便拿一组数据去测48为周期,比如7,7,50/51,输出结果应该为0,但是输出会等于1,明显解法是错误的,于是就有以下两种解法:
方法一:很容易想到有规律 打表也能看出有规律 但是对于每组 A,B规律却不一样 循环节不同
我一开始是找的从第一个数据开始的循环节 但是循环节不一定从第一个位置开始 所以我的毫无疑问会错!
下面给出第一种解法的AC代码:
#include <bits/stdc++.h>
using namespace std;
int f[];
int main()
{
int a,b,n,t;
f[]=;
f[]=;
while(scanf("%d%d%d",&a,&b,&n)&&a&&b&&n)
{
int T=;
for(int i=;i<=n;i++)
{
f[i]=(a*f[i-]+b*f[i-])%;
for(int j=;j<i;j++)
{
if(f[i-]==f[j-]&&f[i]==f[j])
{
T=i-j;
t=j;
break;
}
}
if(T>)
break;
}
if(T>)
{
f[n]=f[(n-t)%T+t];
}
cout<<f[n]<<endl;
}
return ;
}
方法二:鸽巢原理,请参看鸽巢原理
因为f[i]只能取0~7,下面的程序用mp[x][y],记录f[i]的值x y相邻时候出现过,鸽巢原理知,状态总数不会超过7*7!
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
int f[],mp[][];
int main()
{
int n,a,b,k,x,y;
while(scanf("%d%d%d",&a,&b,&n)&&a&&b&&n)
{
memset(mp,,sizeof(mp));
f[]=;
f[]=;
x=;
y=;
k=;
while(!mp[x][y])
{
mp[x][y]=k;
f[k]=(a*y+b*x)%;
y=(a*y+b*x)%;
x=f[k-];
k++;
}
int h=mp[x][y];
if(n<k)
{
printf("%d\n",f[n]);
}
else printf("%d\n",f[(n-h)%(k-h)+h]);
}
return ;
}
HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】的更多相关文章
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 1005 Number Sequence(数论)
HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- HDU 1005 Number Sequence
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 1005:Number Sequence(水题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1005 Number Sequence (模拟)
题目链接 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f( ...
- HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1005 Number Sequence(矩阵)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU - 1005 Number Sequence (矩阵快速幂)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...
随机推荐
- XE10 clientDataset 访问 DataSnap 服务端报错问题,锲而不舍找方法,终于解决了
1. 开发环境说明:win 10 下安装了XE10.2和Delphi7 2.按照网上datasnap 三层与使用xe10 自带的samples 的例子,访问数据库都要报莫名的地址错误,这个太不人性化: ...
- 正则表达式 cheat sheet
- 模板引擎(smarty)知识点总结三
阔别了几个月,小杨又来分享php知识.话不多说,言归正传,今天继续带来smarty的知识点. -----------------smarty assign append 详解 对于这两个的区别和联系 ...
- rtmp指令解释--转
指令 Core rtmp 语法:rtmp { ... } 上下文:根 描述:保存所有 RTMP 配置的块. server 语法:server { ... } 上下文:rtmp 描述:声明一个 RTMP ...
- java进程脱离终端运行
关于 java 进程脱离终端放入后台运行的问题,首先想到是使用nohup命令: 研究了一下tomcat启动脚本.jenkins.war启动方式以及其他linux命令,结论是在目前的linux系统上不使 ...
- Nodejs使用redis
安装方法 安装redis方法请自行百度, 用npm方法,安装nodejs的redis模块 npm install redis 实战 var redis = require("redis&qu ...
- 欢迎大家走进我的园子 ( ^___^ )y 本博客文章目录整理
"记录"是见证成长:"成长"则意味着蜕变:“变",创造无限可能! ------致自己 文章越来越多,不容易查看,特整理了一个目录,方便快速查找 坚持的是分享,搬运的是知识,图的是大家的进步,欢迎更多的 ...
- 【转】String Date Calendar之间的转换
1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...
- K:正则表达式之进阶
子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...
- js知识点图解