一些模板

1e12找原根板子

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,prime[1000005],is_prime[1000005],cnt,qv[1000005],qn[1000005],top,g,Phi,sum,ans[1000005];
void fj(ll x){
	top=0;
	for(ll i=1;prime[i]*prime[i]<=x;i++){
		if(x%prime[i]==0)qv[++top]=prime[i],qn[top]=0;
		while(x%prime[i]==0)qn[top]++,x/=prime[i];
	}
	if(x!=1)qv[++top]=x,qn[top]=1;
}
ll phi(ll x){
	ll ans=x;
	for(ll i=1;prime[i]*prime[i]<=x;i++){
		if(x%prime[i]==0)ans=ans/prime[i]*(prime[i]-1);
		while(x%prime[i]==0)x/=prime[i];
	}
	if(x!=1)ans=ans/x*(x-1);
	return ans;
}
ll ksm(ll A,ll B,ll mod){
	ll Ans=1;
	while(B){
		if(B%2)Ans=Ans*A%mod;
		B/=2;
		A=A*A%mod;
	}
	return Ans;
}
bool check(ll x,ll mod){
	if(ksm(x,Phi,mod)!=1)return 0;
	for(ll i=1;i<=top;i++){
		if(ksm(x,Phi/qv[i],mod)==1)return 0;
	}
	return 1;
}
void init(){
	for(ll i=2;i<=1e6;i++){
		if(!is_prime[i])prime[++cnt]=i;
		for(ll j=1;j<=cnt&&i*prime[j]<=1e6;j++){
			is_prime[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
void find(ll n){
	ll mod=n;
	if(n%2==0&&n!=2&&n!=4){
		fj(n/2);
		if(top>1)return;
	}
	else if(n!=2&&n!=4){
		fj(n);
		if(top>1)return;
	}
	Phi=phi(n);
	fj(Phi);
	for(ll i=1;i<n;i++){
		if(check(i,mod)){
			g=i;
			break;
		}
	}
//	for(ll i=1;i<Phi;i++){
//		if(gcd(i,Phi)==1){
//			ans[++sum]=ksm(g,i,mod);
//		}
//	}
//	sort(ans+1,ans+1+sum);
}
int main(){
	init();
} 

n次剩余(mod为质数)板子

#include<bits/stdc++.h>
#define ll long long
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
gp_hash_table<ll,ll>p;
ll n,Pr,a,prime[1000005],is_prime[1000005],cnt,qv[1000005],qn[1000005],top,g,ans[1000005];
ll sb,ny,T;
ll ksm(ll A,ll B,ll mod){
	ll Ans=1;
	while(B){
		if(B%2)Ans=Ans*A%mod;
		B/=2;
		A=A*A%mod;
	}
	return Ans;
}
void fj(ll x){
	top=0;
	for(ll i=1;prime[i]*prime[i]<=x;i++){
		if(x%prime[i]==0)qv[++top]=prime[i],qn[top]=0;
		while(x%prime[i]==0)qn[top]++,x/=prime[i];
	}
	if(x!=1)qv[++top]=x,qn[top]=1;
}
ll phi(ll x){
	ll ans=x;
	for(ll i=1;prime[i]*prime[i]<=x;i++){
		if(x%prime[i]==0)ans=ans/prime[i]*(prime[i]-1);
		while(x%prime[i]==0)x/=prime[i];
	}
	if(x!=1)ans=ans/x*(x-1);
	return ans;
}
bool check(ll x,ll Phi,ll mod){
	if(ksm(x,Phi,mod)!=1)return 0;
	for(ll i=1;i<=top;i++){
		if(ksm(x,Phi/qv[i],mod)==1)return 0;
	}
	return 1;
}
void init(){
	for(ll i=2;i<=1e6;i++){
		if(!is_prime[i])prime[++cnt]=i;
		for(ll j=1;j<=cnt&&i*prime[j]<=1e6;j++){
			is_prime[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
void find(ll n){
	ll mod=n;
	g=0;
	if(n%2==0&&n!=2&&n!=4){
		fj(n/2);
		if(top>1)return;
	}
	else if(n!=2&&n!=4){
		fj(n);
		if(top>1)return;
	}
	ll Phi=phi(n);
	fj(Phi);
	for(ll i=1;i<n;i++){
		if(check(i,Phi,mod)){
			g=i;
			break;
		}
	}
}
ll Mod(ll x,ll mod){
	x%=mod;
	return x>0?x+mod:x<0?x+mod:x;
}
ll BSGS(ll A,ll B,ll mod){
	ll len=sqrt(mod),num=(mod+len-1)/len,fl=A,sum=1;
	p.clear();
	for(ll i=1;i<=len;i++){
		sum=sum*fl%mod;
		p[sum*B%mod]=i;
	}
	fl=sum,sum=1;
	for(ll i=1;i<=num;i++){
		sum=sum*fl%mod;
		if(p[sum]){
			return i*len-p[sum];
		}
	}
	return 1e9;
}
ll exgcd(ll A,ll B,ll &x,ll &y){
	if(!B){
		x=1,y=0;
		return A;
	}
	ll gcd=exgcd(B,A%B,y,x);
	y-=A/B*x;
	return gcd;
}
ll solve(ll A,ll B,ll mod){
	ll B_=BSGS(g,B,mod),X,gcd,phi=mod-1;
	gcd=exgcd(A,phi,X,sb);
	if(B_%gcd)return 0;
	X*=B_/gcd;phi/=gcd;
	X=Mod(X,phi);
	ans[0]=ksm(g,phi,mod);
	ans[1]=ksm(g,X,mod);
	for(ll i=2;i<=gcd;i++){
		ans[i]=ans[i-1]*ans[0]%mod;
	}
	sort(ans+1,ans+gcd+1);
	return gcd;
}
ll n_sqrt(ll A,ll B,ll mod){
	find(mod);
	if(g==0)printf("0\n");
	else{
		ll fl=solve(A,B,mod);
		if(!fl)printf("0\n");
		else{
			printf("%lld\n",fl);
			for(ll i=1;i<=fl;i++)printf("%lld ",ans[i]);
			printf("\n");
		}
	}
}
int main(){
	init();
}
posted @ 2023-12-20 22:06  zhuzc_114514  阅读(14)  评论(0)    收藏  举报
Title