超级无敌炫酷玄学错误
查看原帖
超级无敌炫酷玄学错误
565742
未来姚班zyleternal love楼主2024/1/11 20:01

很玄学,超级玄学

在这道题中,我的代码如下

#include<bits/stdc++.h>
#define ll __int128
#define int ll
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define repn(x) rep(x,1,n)
inline int read(){int s=0,w=1;char c=getchar();while(c<48||c>57) {if(c=='-') w=-1;c=getchar();}while(c>=48&&c<=57)s=(s<<1)+(s<<3)+c-48,c=getchar();return s*w;}
inline void pf(ll x){if(x<0) putchar('-'),x=-x;if(x>9)pf(x/10);putchar(x%10+48);}
using namespace std;
const int N =2e5+5,M=5e6+5;
struct node{
    int b,c,d;
}a[M];
int n=read(),p[N],cnt,k[N],c[N];
inline void exgcd(int a,int b,int &x,int &y){
    if(!b)return x=1,y=0,void();
    exgcd(b,a%b,y,x),y-=a/b*x;
}
inline int inv(int x,int mod){
    int a=0,b=0;
    exgcd(x,mod,a,b);
    return (a%mod+mod)%mod;
}
inline int CRT(){
    int ans=0,Mx=1;
    rep(i,1,cnt)Mx*=a[i].c;
    rep(i,1,cnt)a[i].d=inv(Mx/a[i].c,a[i].c);
    rep(i,1,cnt)ans+=a[i].b*(Mx/a[i].c)*a[i].d;
    return (ans%Mx+Mx)%Mx;
}
signed main(){ 
    //freopen("work.in","r",stdin);
    repn(i){
        int b=read(),x=read();
        rep(j,1,cnt)if(!(b%p[j])){
            int t=1;
            while(!(b%p[j]))b/=p[j],t*=p[j];
            if(t>k[j])k[j]=t,c[j]=x%k[j];
        }
        if(b!=1){
            for(int j=2;j*j<=b;j++)if(!(b%j)){
                p[++cnt]=j;
                k[cnt]=1;
                while(!(b%j))b/=j,k[cnt]*=j;
                c[cnt] =x%k[cnt];
            }
            if(b!=1)p[++cnt]=b,k[cnt]=b,c[cnt]=x%b;
        }
    }
    rep(i,1,cnt)a[i]={c[i],k[i]};
    pf(CRT());
    return 0;
}

重点在于第 44 行:

c[cnt] =x%k[cnt];

这是一个 __int128 的取模与赋值。

然后打开 O2 优化,输入:

2
36895867 20936228
376055390 103971557

在44行下加入:

cerr << (long long)x << " " << (long long)k[cnt] << " " << (long long)c[cnt]<< "\n";

标准错误流就会输出 c[cnt]=0。

关闭 O2 优化,就没有问题,并通过了此题。

O2 优化把什么东西给弄出问题了捏。

2024/1/11 20:01
加载中...