博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【中国剩余定理】 poj 1006
阅读量:5254 次
发布时间:2019-06-14

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

生理周期  简单模拟

对于超出23 * 28 * 33(21252)时进行求余运算即可。

 

#include
int main(){ //freopen("in.txt","r",stdin); int a,b,c,d,s,m=1; while(scanf("%d %d %d %d",&a,&b,&c,&d),(a!=-1||b!=-1||c!=-1||d!=-1)) { s=a; if(b>s) s=b; if(c>s) s=c; do { s++; }while (((s+d-a)%23!=0)|| ((s+d-b))%28!=0 ||((s+d-c)%33!=0) ); if(s>21252) s=s%21252; printf("Case %d: the next triple peak occurs in %d days.\n",m,s); m++; } return 0;}

 

 

 

中国剩余定理

若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1r1+R2r2+…+Rnrn+RD
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R1 、R2…、

Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;

D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
实际上POJ1006就是中国剩余定理的典型应用
根据上面的条件求出常数R1 = 5544,R2 = 14421,R3 = 1288,D = 21252
每次给的数据中的前三个值即相当于上面的余数。
则显然:
res = R1 * Physical + R2 * Emotion + R3 * Intelligence + RD - givenDate
并且0 =< res <= D

#include 
int main(){ int R1 = 5544, R2 = 14421, R3 = 1288, R = 21252; int ph, em, in, day; int res,i; for(i=1; 1; i++){ scanf("%d%d%d%d", &ph, &em, &in, &day); if(ph==-1)break; res = (R1 * ph + R2 * em + R3 * in - day) % R; res = (res + R - 1) % R + 1; //此步处理了负数和零的两种边界情况 printf("Case %d: the next triple peak occurs in %d days.\n", i, res); } return 0;}

 

提交结果:

模拟          782MS

中国剩余定理  32MS

太高端了!!!!!!

 

转载于:https://www.cnblogs.com/balfish/p/4015165.html

你可能感兴趣的文章
Crontab 在linux中的非常有用的Schedule Jobs
查看>>
ProxySQL Scheduler
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>
反弹SHELL
查看>>
关闭Chrome浏览器的自动更新和升级提示
查看>>
移动、尺寸改变
查看>>
poj2255Tree Recovery【二叉树重构】
查看>>