【51NOD】 1079

来源:互联网 发布:禅道 linux 启动 编辑:程序博客网 时间:2024/06/16 09:23
1079 中国剩余定理
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K。例如,K % 2 = 1, K % 3 = 2, K % 5 = 3。符合条件的最小的K = 23。
Input
第1行:1个数N表示后面输入的质数及模的数量。(2 <= N <= 10)第2 - N + 1行,每行2个数P和M,中间用空格分隔,P是质数,M是K % P的结果。(2 <= P <= 100, 0 <= K < P)
Output
输出符合条件的最小的K。数据中所有K均小于10^9。
Input示例
32 13 25 3
Output示例
23
李陶冶 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 
题解:三数为a b c,余数分别为 m1 m2 m3,%为求   余计算,&&是“且”运算。
孙子定理
孙子定理
1、分别找出能被两个数整除,而满足被第三个整除余一的最小的数。
k1%b==k1%c==0 && k1%a==1;
k2%a==k2%c==0 && k2%b==1;
k3%a==k3%b==0 && k3%c==1;
2、将三个未知数乘对应数字的余数再加起来,减去这三个数的最小公倍数的整数倍即得结果。
Answer = k1×m1 + k2×m2 + k3×m3 - P×(a×b×c);
P为满足Answer > 0的最大整数;
或者 Answer = (k1×m1 + k2×m2 + k3×m3)%(a×b×c) ;
AC代码:
/* 整型应该用long long,刚开始用的int老是过不了 下了一组数据 输入: 761 65 073 3171 6489 502 011 3输出: 968037920*/#include<cstdio>int main(){int N,n[11],m[11];scanf("%d",&N);for(int i=0;i<N;i++){scanf("%d %d",&n[i],&m[i]);}long long sum=1;for(int i=0;i<N;i++){sum*=n[i];  //输入上面的那组数据,这里用int会超限的。。 }long long x[11];for(int i=0;i<N;i++){long long y=sum/n[i];long long j=y;while(y%n[i]!=1){y+=j;}x[i]=y;}long long ans1=0,ans2=1;for(int i=0;i<N;i++){ans1+=x[i]*m[i];ans2*=n[i];}printf("%lld\n",(ans1%ans2));return 0;}


原创粉丝点击