problemcutter

导航

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)    收藏  举报