HDU 1573 中国剩余?简单遍历
题意很明确,可以说是裸的中国剩余定理。但是注意到一点,a[i]是小于等于10的,也就是说,所有a的最小公倍数不会超过2520(1到10的最小公倍数为2520),并且一个周期就是a的最小公倍数。
于是就很简单了。遍历一下从0到lcm-1(或1到lcm)的所有数直到找到一个符合条件的特解,如果找不到自然就没有解。之后就是求有多少个周期,简单除一下就行。
注意一点,解中不包含0。
#include<cstdio> #include<cstring> int a[15],b[15],n,m,T,all,ans,p,q,mi,pd; int gcd(int a,int b){return b?gcd(b,a%b):a;} int main(){ scanf("%d",&T); while(T--){ all=1; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]),b[i]=(b[i]%a[i]+a[i])%a[i]; ans=-1; mi=a[1]; for(int i=2;i<=n;i++)mi=(mi*a[i])/gcd(mi,a[i]); for(int i=0;i<mi;i++){ pd=0; for(int j=1;j<=n;j++) if(i%a[j]!=b[j]){ pd=1;break; } if(!pd){ans=i;break;} } if(~ans&&ans<=m)printf("%d\n",(m-ans)/mi+(ans>0));else printf("0\n"); } }
posted on 2017-11-10 15:06 problemcutter 阅读(132) 评论(0) 收藏 举报
浙公网安备 33010602011771号