数论的EX
既然是EX,那cost是多少
扩展欧几里得
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ret=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ret;
}
扩展欧拉定理
扩展欧拉定理:
· 当\(a,m\)互质:\(a^b\equiv a^{b\ mod\ \varphi(m)}(mod\ m)\)
· 当\(a,m\)不互质且\(b<\varphi(m)\)同余于它本身
· 当他两个不互质且\(b>=\varphi(m)\):\(a^b\equiv a^{b\ mod\ \varphi(m)+\varphi(m)}(mod\ m)\)
顺便提一嘴欧拉定理:\(a^{\varphi(m)}\equiv1(mod\ m)\)
扩展中国剩余定理
int gsc(int x,int y,int mo)
{
int ret=0;
while(y)
{
if(y&1) (ret+=x)%=mo;
y>>=1;
x=(x+x)%mo;
}
return ret;//龟速乘,防爆long long
}
for(int i=1;i<=n;i++) cin>>mod[i]>>yu[i];
int ans=yu[1],M=mod[1],t=0,y=0;
for(int i=2;i<=n;i++)
{
int rig=((yu[i]-ans)%mod[i]+mod[i])%mod[i];
int gcd=exgcd(M,mod[i],t,y);
if(rig%gcd!=0)
{
ans=-1;
break;
}
t=gsc(t,rig/gcd,mod[i]);
ans+=M*t;
M=mod[i]/gcd*M;
ans=(ans%M+M)%M;
}
cout<<ans<<'\n';
扩展lucas
void fj(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
{
cc[++tot]={i,1};
while(x%i==0)
{
cc[tot].val*=i;
x/=i;
}
}
}
if(x>1) cc[++tot]={x,x};
}
int fat(int nn,int p,int k)
{
if(!nn) return 1;
int ret=1;
for(int i=2;i<k;i++)
{
if(i%p) ret=ret*i%k;
}
ret=ksm(ret,nn/k,k);
for(int i=2;i<=nn%k;i++)
{
if(i%p) ret=ret*i%k;
}
return ret*fat(nn/p,p,k)%k;
}
int inv(int a,int b)
{
int x=0,y=0;
exgcd(a,b,x,y);
return (x+b)%b;
}
int C(int nn,int mm,int p,int k)
{
if(nn<mm) return 0;
int a=fat(nn,p,k),b=fat(mm,p,k),c=fat(nn-mm,p,k);
int cnt=0;
for(int i=p;i<=nn;i*=p) cnt+=nn/i;
for(int i=p;i<=mm;i*=p) cnt-=mm/i;
for(int i=p;i<=nn-mm;i*=p) cnt-=(nn-mm)/i;
return a*inv(b,k)%k*inv(c,k)%k*ksm(p,cnt,k)%k;
}
int exlucas()
{
fj(P);
int ans=0;
for(int i=1;i<=tot;i++)
{
yu[i]=1;
int op=nx;
for(int j=1;j<=mx;j++)
{
(yu[i]*=C(op,w[j],cc[i].pos,cc[i].val))%=cc[i].val;
op-=w[j];
}
}
for(int i=1;i<=tot;i++)
{
int mi=P/cc[i].val;
ans+=yu[i]%P*(mi*inv(mi,cc[i].val)%P)%P;
}
ans=(ans+P)%P;
return ans;
}

浙公网安备 33010602011771号