同余方程的合并——codeforces338D

来源:互联网 发布:爱玩网络 编辑:程序博客网 时间:2024/05/14 07:18
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;long long m[10002],n,M,lcm;int k;long long gcd(long long a,long long b){    return b?gcd(b,a%b):a;}long long egcd(long long a,long long b,long long &x,long long &y){    if(b==0)    {        x=1;  y=0;        return a;    }    long long gcd=egcd(b,a%b,y,x);    y-=a/b*x;    return gcd;}long long china(){    long long x,y,b=0,mm=m[0],d;    for(int i=1;i<k;i++)    {        long long c=b+i;        d=egcd(mm,m[i],x,y);        if(c%d) return -1;        long long t=m[i]/d;        x=((c/d*x)%t+t)%t;        if(x) x-=t;        b-=mm*x;        mm=mm/gcd(mm,m[i])*m[i];    }    return b;}bool judge(){    if(lcm>n) return false;    long long ans=china();    if(ans<0||ans>n) return false;    if(ans==0) ans=lcm;    if(ans+k-1>M) return false;    for(int i=0;i<k;i++)        if(gcd(lcm,ans+i)!=m[i]) return false;    return true;}int main(){    int i;    scanf("%I64d%I64d%d",&n,&M,&k);    for(i=0;i<k;i++) scanf("%I64d",&m[i]);    lcm=1;    for(i=0;i<k;i++)    {        lcm=lcm/gcd(lcm,m[i])*m[i];        if(lcm>n) break;    }    judge()?puts("YES"):puts("NO");}

0 0
原创粉丝点击