很玄学,超级玄学
在这道题中,我的代码如下
#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 优化把什么东西给弄出问题了捏。