一些模板
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();
}

浙公网安备 33010602011771号