关于万能头
  • 板块学术版
  • 楼主Wilson_Lee
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/11/15 10:00
  • 上次更新2023/10/27 02:54:48
查看原帖
关于万能头
513900
Wilson_Lee楼主2022/11/15 10:00
#include<bits/stdc++.h>
using namespace std;

typedef __int128_t i128;
typedef pair<i128,i128> pa;
const int MAXN=1e4+5;
queue<pa>q;
long long m[MAXN],r[MAXN];
i128 exgcd(i128 a,i128 b,i128 &x,i128 &y)
{
    if(!b) return x=1,y=0,a;
    i128 d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
i128 gcd(i128 x,i128 y){return (!y)?x:gcd(y,x%y);}
i128 lcm(i128 x,i128 y){return x*y/gcd(x,y);}
long long exCRT()
{
    while(q.size()>1)
    {
        i128 m1=q.front().first,r1=q.front().second;q.pop();
        i128 m2=q.front().first,r2=q.front().second;q.pop();
        i128 k1,k2,tmp=r2-r1;
        i128 d=exgcd(m1,m2,k1,k2);
        if(tmp%d) return -1;
        k1*=tmp/d,k2*=-tmp/d;
        i128 l=m1*m2/d,x=(r1+k1*m1%l+l)%l;
        q.push({l,x});
    }
    return q.front().second;
}
int main()
{
    long long x,y,k;
    cin>>x>>y>>k;
    i128 mul=1;
    for(int i=1;i<=k;++i)
    {
        scanf("%lld",&m[i]);
        mul=lcm(mul,m[i]);
        if(mul>x){printf("NO\n");return 0;}
        r[i]=((m[i]-i+1)%m[i]+m[i])%m[i];
        q.push({m[i],r[i]});
    }
    long long ans=exCRT();
    if(ans==-1 || ans+k-1>y){printf("NO\n");return 0;}
    for(int i=1;i<=k;++i) if(gcd(mul,ans+i-1)!=m[i]){printf("NO\n");return 0;}
    printf("YES\n");
    return 0;
}

这份代码在本地编译能过,但交上去会CE,似乎是gcd和lcm函数命名与库函数冲突的原因,请问在noip考场上会本地就爆CE吗?(不然真就吃大亏了)

2022/11/15 10:00
加载中...