Step WA on test 4

其实这是 7.10 的题,由于 7.26 的模拟赛突然想了起来。

#include <bits/stdc++.h>
#define int long long
using namespace std;
int lcm(int x,int y){
	int p=__gcd(x,y);
	return (int)((__int128)p*(x/p)*(y/p));
}
int qpow(int a,int b,int mod){
    int ans=1;
    while(b){
        if(b&1){
            ans=(ans%mod*a%mod)%mod;
        }
        a=(__int128)(a%mod)*(a%mod)%mod;
        b>>=1;
    }
    return ans;
}
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37};
bool is_prime(int n){
	if(n<2) return false;
	for(int i=0;i<12;i++){
		if(n%prime[i]==0) return n==prime[i];
	}
	int d=n-1,s=0;
	while(d%2==0){
		d/=2;
		s++;
	}
	for(int i=0;i<12;i++){
		int a=prime[i];
		if(a>=n) continue;
		int x=qpow(a,d,n);
		if(x==1||x==n-1) continue;
		bool flag=true;
		for(int r=1;r<s;r++){
			x=(__int128)x*x%n;
			if(x==n-1){
				flag=false;
				break;
			}
		}
		if(flag==0) return false;
	}
	return true;
}
int pollard_rho(int n){
    if(n%2==0) return 2;
    if(n%3==0) return 3;
    while(1){
        int c=rand()%(n-1)+1;
        int x=rand()%n;
        int y=x;
        int d=1;
        for(int it=0;it<10000&&d==1;it++){
            x=((__int128)x*x+c)%n;
            y=((__int128)y*y+c)%n;
            y=((__int128)y*y+c)%n;
            d=__gcd(llabs(x-y),n);
        }
        if(d>1&&d<n) return d;
    }
}
void fc(int n,vector<int>& f){
    if(n==1) return ;
    //int d=pollard_rho(n);
    if(is_prime(n)){
        f.push_back(n);
        return ;
    }else{
        int d=pollard_rho(n);
        fc(d,f);
        fc(n/d,f);
    }
}
int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1,y=0;
		return a;
	}
	int k=exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
	return k;
}
int inv(int a,int mod){
	int x,y;
	int g=exgcd(a,mod,x,y);
	return (x%mod+mod)%mod;
}
int crt(int a1,int m1,int a2,int m2){
	int iv=inv(m1%m2,m2);
	int t=((a2-a1)%m2+m2)%m2;
	t=(int)((__int128)t*iv%m2);
	return a1+(__int128)m1*t;
}
int solve(int lcma,vector<int> f){
	map<int,int> mp;
	vector<pair<int,int>> fs;
	int k=0;
	for(int i=0;i<f.size();i++){
		mp[f[i]]++;
		if(i==f.size()-1||f[i]!=f[i+1]){
			int p=f[i];
			int cnt=mp[p];
			int val=1;
			for(int j=0;j<cnt;j++){
				val*=p;
			}
			fs.push_back({p,val});
			k++;
		}
	}
	int ans=lcma;
	for(int i=0;i<(1<<k);i++){
		int a=1,b=1;
		for(int j=0;j<k;j++){
			if(i&(1<<j)){
				a*=fs[j].second;
			}else{
				b*=fs[j].second;
			}
		}
		if(a==1){
			int m=0;
			if(b==1) m=b;
			else m=b-1;
			ans=min(ans,m);
		}else if(b==1){
			ans=min(ans,a);
		}else{
			//1
			int z=crt(0,a,b-1,b);
			if(z>0) ans=min(ans,z);
			z=crt(0,b,a-1,a);
			if(z>0) ans=min(ans,z);
		}
	}
	return ans;
}
signed main(){
	srand(time(0));
	int n;
	cin>>n;
	int x;
	cin>>x;
	int lcma=x;
	for(int i=2;i<=n;i++){
		cin>>x;
		lcma=lcm(lcma,x);
	}
	lcma*=2;
	vector<int> f;
	fc(lcma,f);
	sort(f.begin(),f.end());
	int ans=solve(lcma,f);
	cout<<ans;
}

居然会 Pollard-Rho!教我%%%

何意味。

还有张知行。

以上内容使用 GPT-5.6-sol xhigh 润色。

有人类吗。

有没有人类。

没有,死光了