数论二次总结
大模板在此。(可能有错)。
LL fast(LL a,LL b,LL c){LL ans=1;for(;b;a=a*a%c,b>>=1)if(b&1)ans=ans*a%c;return ans;}
LL mul(LL a,LL b,LL c){return ((a*b-((LL)((long double)a/c*b+1e-8))*c)+c)%c;}
void exgcd(LL a,LL b,LL& d,LL& x,LL& y){
if(!b)return (void)(d=a,x=1,y=0);
LL t=x;x=y;y=t-a/b*x;
}
LL inv(LL a,LL p){
LL x,y,d;
exgcd(a,p,d,x,y);
return d>1?-1:(x%p+p)%p;
}
LL china(LL* m,LL* a,int n){//exgcd合并方程
LL M=m[1],A=a[1],b,k,y,d;
up(i,2,n){
b=a[i]-A;
exgcd(M,m[i],d,k,y);
if(b%d)return -1;
k*=b/d;
A+=k*M;
M=M*m[i]/d;
A=(A%+M)%M;
}
return A;
}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
bool rabin_miller(LL a,LL p){
if(!(p&1)||p<=1)return 0;
LL d=p-1,m;
if(!(d&1))d>>=1;
m=fast(a,d,p);
if(m==1)return 1;
for(;d<p;m=m*m%p,d<<=1)if(m==p-1)return 1;
return 0;
}
bool isprime(LL p){
static int prime[10]={2,3,5,7,11,13,17,19,23,29};
up(i,0,9){
if(prime[i]==p)return 1;
if(!rabin_miller(prime[i],p))return 0;
}
return 1;
}
LL fac[maxn],cnt=0;
void get(LL x){
if(isprime(x)){fac[++cnt]=x;return;}
int c=3;
while(true){
LL x1=1,x2=1,k=2,i=1,d;
while(true){
x1=((x1*x1%mod)+c)%mod;
d=gcd(abs(x1-x2),x);
if(d>1){get(d),get(x/d);return;}
if(x1==x2)break;
if(++i==k)k<<=1,x2=x1;
}
c++;
}
}
LL log_mod(LL a,LL b,LL mod){
LL ret=1;
up(i,0,50){
if(ret==b)return i;
ret=ret*a%mod;
}
LL g=0,d,D=1,tmp;
while((d=gcd(a,mod))!=1){
if(b%d)return -1;
mod/=d,b/=d;
g++;b/=D=D*(a/d)%mod;
}
map<LL,LL> t;
LL m=(LL)sqrt(mod+1.0),v,e;
v=inv(fast(a,m,mod),mod);
t[1]=0;
up(i,0,m-1){
e=e*a%mod;
if(!t.count(e))t[e]=i;
}
up(i,0,m-1){
if(t.count(b))return i*m+t[b]+g;
b=b*v%mod;
}
return -1;
}

浙公网安备 33010602011771号