HDU1788 Chinese remainder theorem again
2012-09-26 11:03
411 查看
题目大意:开始还真准备用同余线性方程组做了,后来仔细一看~~哟~~可以优化~~哈。
思路:因为
N%M1=M1-a
N%M2=M2-a
N%M3=M3-a
即:N%Mi=Mi-a,所以 N%Mi+a=Mi,所以N+a和0同余于Mi(i=1,2,3……),特别要记住:能够化成和0同余的一定要变式,因为这样简单多了,完全转化为求Mi的最小公倍数,
即是:N+a= (Mi的最小公倍数)
如此自然对于每个Mi都能够整除。
一开始,我是这样想的:
N=Mi-a+kMi的,准备用解线性同余方程的方式来做了。
思路:因为
N%M1=M1-a
N%M2=M2-a
N%M3=M3-a
即:N%Mi=Mi-a,所以 N%Mi+a=Mi,所以N+a和0同余于Mi(i=1,2,3……),特别要记住:能够化成和0同余的一定要变式,因为这样简单多了,完全转化为求Mi的最小公倍数,
即是:N+a= (Mi的最小公倍数)
如此自然对于每个Mi都能够整除。
一开始,我是这样想的:
N=Mi-a+kMi的,准备用解线性同余方程的方式来做了。
AC program: #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; __int64 mm[12]; __int64 gcd(__int64 a,__int64 b) { if(b==0)return a; return gcd(b,a%b); } int main() { int k,a; while(cin>>k>>a,k+a) { __int64 tmp=1; for(int i=0;i<k;i++) { cin>>mm[i]; if(tmp<mm[i]) //求N个数的最小公倍数是,用前面的最小公倍数当做一项来求后一项的最小公倍数, //同求N个数的最大公约数 swap(tmp,mm[i]); tmp=tmp*mm[i]/gcd(tmp,mm[i]); } cout<<tmp-a<<endl; } system("pause"); return 0;}
相关文章推荐
- hdu1788 Chinese remainder theorem again
- 【数论】【中国剩余定理】【LCM】hdu1788 Chinese remainder theorem again
- HDU1788-Chinese remainder theorem again
- Chinese remainder theorem again(hdu1788中国剩余定理)
- HDU1788 Chinese remainder theorem again【中国剩余定理】
- Chinese remainder theorem again(hdu 1788)两种解法:线性同余方程或者简单的最小公倍数
- HDU——1788 Chinese remainder theorem again
- HDU 1788 Chinese remainder theorem again
- hdu 1788 Chinese remainder theorem again(最小公倍数)
- HDU1788 Chinese remainder theorem again【中国剩余定理】
- HDU 1788 Chinese remainder theorem again
- hdu 1788 Chinese remainder theorem again(最小公倍数)
- HDOJ-1788 Chinese remainder theorem again(数论)
- 【数论】 HDOJ 1788 Chinese remainder theorem again
- 【HDU】 1788 Chinese remainder theorem again
- Hdu 1788 Chinese remainder theorem again
- HDU 1788 Chinese remainder theorem again 中国剩余定理转换
- HDU 1788——Chinese remainder theorem again
- 读控制台HDU 1788 Chinese remainder theorem again 数论读控制台
- hdoj-1788-Chinese remainder theorem again