亿些模板【数论数学】

文章目录

    • 前言
  • 数论数学模板
    • GCD
    • exgcd
    • 快速幂
    • 线性推逆元
    • 线性推逆元(非连续)
    • 逆元求组合数
    • 矩阵乘法
    • 线性筛素数-埃氏筛
    • 线性筛素数-线性筛
    • 线性筛欧拉-埃氏筛
    • 线性求欧拉
    • 龟速乘
    • FFT
    • NTT
    • 分治FFT
    • 多项式求逆
    • 扩展中国剩余定理
    • Lucas定理
    • 高斯消元
    • BSGS
    • 拉格朗日插值
    • 二次剩余
    • 线性基
    • 杜教筛

前言

因为老是懒得打模板的时候老是扣不到自己的标(因为之前的都打得太丑了),所以导致我十分的不爽。便打算开一个模板库。会不断更新的


数论数学模板

(某些附有证明)

GCD

我们设d=gcd(a,b)我们设d=gcd(a,b)d=gcd(a,b)
∵d∣a,d∣b\because d\mid a,d\mid bda,db
∴d∣a%b\therefore d\mid a\%bda%b
设gcd(b,a%b)=d′设gcd(b,a\%b)=d'gcd(b,a%b)=d
∵d′∣b,d′∣a%b\because d'\mid b,d'\mid a\%bdb,da%b
∴d′∣a\therefore d'\mid ada
gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)

int gcd(int a,int b)
{if (b==0){return a;}return gcd(b,a%b);
}

exgcd

ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)
bx′+(a%b)y′=gcd(b,a%b)bx'+(a\%b)y'=gcd(b,a\%b)bx+(a%b)y=gcd(b,a%b)
展开(a%b)(a\%b)(a%b)
bx′+(a−⌊a/b⌋b)y′=gcd(b,a%b)bx'+(a-\lfloor a/b\rfloor b)y'=gcd(b,a\%b)bx+(aa/bb)y=gcd(b,a%b)
拆开括号
bx′+ay′−⌊a/b⌋by′=gcd(b,a%b)bx'+ay'-\lfloor a/b\rfloor by'=gcd(b,a\%b)bx+aya/bby=gcd(b,a%b)
aaabbb取出
ay′+b(x′−⌊a/b⌋y′)=gcd(b,a%b)ay'+b(x'-\lfloor a/b\rfloor y')=gcd(b,a\%b)ay+b(xa/by)=gcd(b,a%b)
∵gcd(a,b)=gcd(b,a%b)\because gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
∴ay′+b(x′−⌊a/b⌋y′)=ax+by\therefore ay'+b(x'-\lfloor a/b\rfloor y')=ax+byay+b(xa/by)=ax+by
将两边的aaabbb取出
y′+(x′−⌊a/b⌋y′)=x+yy'+(x'-\lfloor a/b \rfloor y')=x+yy+(xa/by)=x+y
然后由于两边是等价的
∴{x=y′y=(x′−⌊a/b⌋y′)\therefore \left\{\begin{matrix} \\ x=y' \\ y=(x'-\lfloor a/b \rfloor y') \\ \\ \end{matrix}\right. x=yy=(xa/by)

#include<cstdio>
using namespace std;
int x,y,a,b,k;
void gcd(int a,int b)
{if (b==0){x=1;y=0;return;}gcd(b,a%b);k=x;x=y;y=k-a/b*y;return;
}
int main()
{scanf("%d%d",&a,&b);gcd(a,b);printf("%d",(x+b)%b);
}

快速幂

ll power(ll x,ll b)
{if(!b) return 1;ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}

线性推逆元

首先对于p,我们将其分解为ki+r(k=⌊pi⌋,r=p%r)ki+r(k=\lfloor \frac{p}{i}\rfloor,r=p\%r)ki+r(k=ip,r=p%r),然后有
ki+r≡0(modp)ki+r\equiv 0(mod\ \ p)ki+r0(mod  p)
左右两边同时乘上一个i−1∗r−1i^{-1}*r^{-1}i1r1
k∗r−1+i−1≡0(modp)k*r^{-1}+i^{-1}\equiv 0(mod\ \ p)kr1+i10(mod  p)
i−1≡−k∗r−1(modp)i^{-1}\equiv -k*r^{-1}(mod\ \ p)i1kr1(mod  p)
i−1≡−⌊pi⌋∗(p%i)−1(modp)i^{-1}\equiv -\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}(mod\ \ p)i1ip(p%i)1(mod  p)
反正本来就要%p\%p%p
i−1=−⌊pi⌋∗(p%i)−1%pi^{-1}= -\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}\%pi1=ip(p%i)1%p
因为iii(p%i)(p\%i)(p%i)小,按照递推的顺序我们在求出i−1i^{-1}i1之前就已经求出(p%i)−1(p\%i)^{-1}(p%i)1了。但是我们还要保证不是负数,所以我们可以直接计算
i−1=p−⌊pi⌋∗(p%i)−1%pi^{-1}= p-\lfloor \frac{p}{i}\rfloor*(p\%i)^{-1}\%pi1=pip(p%i)1%p

#include<cstdio>
using namespace std;
int n,p;
long long inv[3000010];
int main()
{scanf("%d%d",&n,&p);inv[1]=1;printf("%d\n",inv[1]);for(int i=2;i<=n;i++)inv[i]=(long long)p-p/i*inv[p%i]%p,printf("%d\n",inv[i]);
}

线性推逆元(非连续)

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e6+10;
ll n,p,K,S,a[N],s[N],k[N],ans; 
__attribute__((optimize("O3"))) inline int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
ll power(ll x,ll b,ll p)
{ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
int main()
{n=read();p=read();K=read();S=1;k[0]=1;s[0]=1;for(int i=1;i<=n;i++){a[i]=read();S=S*a[i]%p;s[i]=S;k[i]=k[i-1]*K%p;}S=power(S,p-2,p);for(int i=n;i>=1;i--){ll inv=S*s[i-1]%p;S=S*a[i]%p;(ans+=k[i]*inv%p)%=p;}printf("%lld",ans);
}

逆元求组合数

ll power(ll x,ll b)
{ll ans=1;x%=XJQ;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
ll C(ll n,ll m)
{ll ans1=1,ans2=1;for(ll i=n-m+1;i<=n;i++)ans2=ans2*i%XJQ;for(ll i=1;i<=m;i++)ans1=ans1*power(i,XJQ-2)%XJQ;return ans2*ans1%XJQ;
}

矩阵乘法

struct matrix{ll a[size][size];
}f;
matrix operator *(matrix &a, matrix &b) {matrix c;memset(c.a,0,sizeof(c.a));for (ll i=0;i<size;i++)for (ll j=0;j<size;j++)for (ll k=0;k<size;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j])%=YMW;return c;
}
void ksm(matrix &f,ll b) {matrix a=f;while(b){if(b&1) a=a*f;f=f*f;b>>=1;}f=a;
}

线性筛素数-埃氏筛

void primes()
{for(ll i=2;i<=N;i++)if(!v[i]){prime[++cnt]=i;s[i]=1;//素数也标记for(ll j=2;i*j<=N;j++){if(!v[j]&&j<=i)//是素数的乘积s[i*j]=1;v[i*j]=true;}}
}

线性筛素数-线性筛

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt,prime[6893911];
bool v[10000001];
int main()
{scanf("%d%d",&n,&m);v[1]=1;for(int i=2;i<=n;i++){if(!v[i]) prime[++cnt]=i;for(int j=1;j<=cnt&&i*prime[j]<=n;j++){v[prime[j]*i]=1;if(!(i%prime[j])) break;}}for(int i=1;i<=m;i++){int x;scanf("%d",&x);if(v[x]) printf("No\n");else printf("Yes\n");}
}

线性筛欧拉-埃氏筛

for (int i=2;i<=n;i++) phi[i]=i;//初始化欧拉
for (int i=2;i<=n;i++)
{if (phi[i]==i)//质数for (int j=i;j<=n;j+=i)phi[j]=phi[j]/i*(i-1);//筛去一个质因子sum+=phi[i];//统计答案
}

线性求欧拉

ll phi(ll n)//求欧拉函数
{ll ans=n;for (ll i=2;i*i<=n;i++)if (n%i==0){ans=ans/i*(i-1);while (n%i==0) n/=i;}if (n>1) ans=ans/n*(n-1);return ans;
}

龟速乘

ll ksc(ll a,ll b)
{a%=YMW;b%=YMW;ll c=(long double)a*b/YMW;ll ans=a*b-c*YMW;if(ans<0) ans+=YMW;else if(ans>=YMW) ans-=YMW;return ans;
}

FFT

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=1e6+100;
const double Pi=acos(-1);
int n,m,l,r[N<<2];
struct complex{complex(double xx=0,double yy=0){x=xx;y=yy;}		double x,y;
}f[N<<2],g[N<<2];
complex operator +(complex a,complex b)
{return complex(a.x+b.x,a.y+b.y);}
complex operator -(complex a,complex b)
{return complex(a.x-b.x,a.y-b.y);}
complex operator *(complex a,complex b)
{return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void fft(complex *f,int op)
{for(int i=0;i<n;i++)if(i<r[i]){complex tmp=f[i];f[i]=f[r[i]];f[r[i]]=tmp;}for(int p=2;p<=n;p<<=1){int len=p>>1;complex tmp=complex(cos(Pi/len),sin(Pi/len)*op);for(int k=0;k<n;k+=p){complex buf(1,0);for(int i=k;i<k+len;i++){complex tt=buf*f[len+i];f[len+i]=f[i]-tt;f[i]=f[i]+tt;buf=buf*tmp;}}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<=n;i++)scanf("%lf",&f[i].x);for(int i=0;i<=m;i++)scanf("%lf",&g[i].x);for(m+=n,n=1;n<=m;n<<=1);for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);fft(f,1);fft(g,1);for(int i=0;i<n;i++)f[i]=f[i]*g[i];fft(f,-1);for(int i=0;i<=m;i++)printf("%.0lf ",fabs(f[i].x)/n);
}

NTT

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e6+100,XJQ=998244353,G=3,Gi=332748118;
const double Pi=acos(-1);
ll n,m,l,r[N<<2],f[N<<2],g[N<<2];
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void ntt(ll *f,ll op)
{for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(op==1?G:Gi,(XJQ-1)/p);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[len+i]%XJQ;f[len+i]=(f[i]-tt+XJQ)%XJQ;f[i]=(f[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=0;i<=n;i++) scanf("%lld",&f[i]);for(ll i=0;i<=m;i++) scanf("%lld",&g[i]);for(m+=n,n=1;n<=m;n<<=1);for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);ntt(f,1);ntt(g,1);for(ll i=0;i<n;i++)f[i]=f[i]*g[i]%XJQ;ntt(f,-1);ll inv=power(n,XJQ-2);for(ll i=0;i<=m;i++)printf("%lld ",f[i]*inv%XJQ);
}

分治FFT

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6+10,XJQ=998244353;
ll n,g[N],f[N],a[N],b[N],R[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;b>>=1;x=x*x%XJQ;}return ans;
}
void NTT(ll *f,ll logn,ll op){ll n=1<<logn;for(ll i=0;i<n;i++)if(i<R[i])swap(f[i],f[R[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(XJQ-1)/p);if(op==-1)tmp=power(tmp,XJQ-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[len+i]%XJQ;f[len+i]=(f[i]-tt+XJQ)%XJQ;f[i]=(f[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}if(op==-1){ll tmp=power(n,XJQ-2);for(ll i=0;i<n;i++)f[i]=f[i]*tmp%XJQ;}return;
}
void cdq(ll l,ll r,ll logn){if(!logn) return;if(l>=n)return;ll n=1<<logn,mid=l+r>>1;cdq(l,mid,logn-1);for(ll i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)?n>>1:0);memset(a+(r-l)/2,0,sizeof(ll)*(r-l)/2);memcpy(a,f+l,sizeof(ll)*(r-l)/2);memcpy(b,g,sizeof(ll)*(r-l));NTT(a,logn,1);NTT(b,logn,1);for(ll i=0;i<n;i++)a[i]=a[i]*b[i]%XJQ;NTT(a,logn,-1);for(ll i=(r-l)/2;i<r-l;i++)f[l+i]=(f[l+i]+a[i])%XJQ;cdq(mid,r,logn-1);return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<n;i++)scanf("%lld",&g[i]);f[0]=1;ll logn;for(logn=0;(1<<logn)<n;logn++);cdq(0,1<<logn,logn);for(ll i=0;i<n;i++)printf("%lld ",(f[i]+XJQ)%XJQ);
}

多项式求逆

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const ll N=1e6+100,XJQ=998244353,G=3,Gi=332748118;
const double Pi=acos(-1);
ll n,m,l,a[N<<2],b[N<<2],c[N<<2],r[N<<2];
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void ntt(ll *f,ll n,ll op)
{for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(G,(XJQ-1)/p);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[len+i]%XJQ;f[len+i]=(f[i]-tt+XJQ)%XJQ;f[i]=(f[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}if(op==1) return;int inv=power(n,XJQ-2);reverse(f+1,f+n);for(int i=0;i<n;i++) f[i]=f[i]*inv%XJQ;
}
void work(ll *a,ll *b,ll l)
{if(l==1){b[0]=power(a[0],XJQ-2);return;}work(a,b,(l+1)>>1);ll cnt;for(cnt=1;cnt<(l<<1);cnt<<=1);for(ll i=1;i<cnt;i++)r[i]=(r[i>>1]>>1)|((i&1)?cnt>>1:0);for(ll i=0;i<l;i++) c[i]=a[i];for(ll i=l;i<cnt;i++) c[i]=0;ntt(c,cnt,1);ntt(b,cnt,1);for(ll i=0;i<cnt;i++)b[i]=(2-b[i]*c[i]%XJQ+XJQ)%XJQ*b[i]%XJQ;ntt(b,cnt,-1);for(ll i=l;i<cnt;i++) b[i]=0;
}
int main()
{scanf("%lld",&n);for(ll i=0;i<n;i++)scanf("%lld",&a[i]);work(a,b,n);for(ll i=0;i<n;i++)printf("%lld ",b[i]);
}

扩展中国剩余定理

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+100;
ll n,a[N],b[N],ans;
ll ksc(ll a,ll b,ll YMW)
{a%=YMW;b%=YMW;ll c=(long double)a*b/YMW;ll ans=a*b-c*YMW;if(ans<0) ans+=YMW;else if(ans>=YMW) ans-=YMW;return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1;y=0;return a;}ll d=exgcd(b,a%b,x,y),z=x;x=y;y=z-a/b*y;return d;
}
void work()
{ll x,y,k,M=b[1];ans=a[1];for(ll i=2;i<=n;i++){ll A=M,B=b[i],c=(a[i]-ans%B+B)%B;ll d=exgcd(A,B,x,y),g=B/d;if(c%d){ans=-1;return;}x=ksc(x,c/d,g);ans+=x*M;M*=g;ans=(ans%M+M)%M;}
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld%lld",&b[i],&a[i]);work();printf("%lld",ans);
}

Lucas定理

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll T,n,m,p,a[110000];
ll power(ll x,ll b,ll p)
{ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
ll C(ll n,ll m,ll p)
{if(m>n) return 0ll;return a[n]*power(a[m],p-2,p)%p*power(a[n-m],p-2,p)%p;
}
ll lucas(ll n,ll m,ll p)
{if(!m) return 1ll;return lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
int main()
{scanf("%lld",&T);while(T--){scanf("%lld%lld%lld",&n,&m,&p);a[0]=1;for(ll i=1;i<=p;i++)a[i]=a[i-1]*i%p;printf("%lld\n",lucas(n+m,m,p));}return 0;
}

高斯消元

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=110;
int n;
double b[N],c[N][N];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)scanf("%lf",&c[i][j]);scanf("%lf",&b[i]);}for(int i=1;i<=n;i++){int z=i;for(int j=i+1;j<=n;j++){if(fabs(c[j][i])>fabs(c[z][i]))z=j;}for(int j=1;j<=n;j++)swap(c[i][j],c[z][j]);swap(b[i],b[z]);if(!c[i][i]){printf("No Solution\n");return 0;}for(int j=1;j<=n;j++){if(i==j) continue;double rate=c[j][i]/c[i][i];for(int k=i;k<=n;k++)c[j][k]-=c[i][k]*rate;b[j]-=b[i]*rate; }}for(int i=1;i<=n;i++)printf("%.2lf\n",b[i]/c[i][i]);
}

BSGS

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
ll p,b,n,ans=1e18,t;
map<ll,ll> v;
ll power(ll x,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
int main()
{scanf("%lld%lld%lld",&p,&n,&b);t=(int)sqrt(p)+1;for(ll i=0;i<t;i++){ll val=b*power(n,i)%p;v[val]=i;}n=power(n,t);if(n==0) {if(!b) printf("1");else printf("no solution");return 0;}for(ll i=0;i<=t;i++){ll val=power(n,i);ll j=v.find(val)==v.end()?-1:v[val];if(j>=0&&i*t-j>=0) ans=min(ans,i*t-j);}if(ans==1e18) printf("no solution");else printf("%lld",ans);
}

拉格朗日插值

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e3+10,XJQ=998244353;
ll n,k,x[N],y[N],ans;
ll power(ll x,ll b){x%=XJQ;ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
int main()
{scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld%lld",&x[i],&y[i]);for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++)if(i!=j)(y[i]*=(k-x[j]+XJQ)%XJQ*power(x[i]-x[j]+XJQ,XJQ-2)%XJQ)%=XJQ;(ans+=y[i])%=XJQ;		}printf("%lld",ans);
}

二次剩余

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll T,n,p,k,w;
struct complex{complex(ll xx=0,ll yy=0){x=xx;y=yy;}ll x,y;
};
complex operator+(complex &a,complex &b)
{return complex((a.x+b.x)%p,(a.y+b.y)%p);}
complex operator-(complex &a,complex &b)
{return complex((a.x-b.x+p)%p,(a.y-b.y+p)%p);}
complex operator*(complex &a,complex &b)
{return complex((a.x*b.x%p+a.y*b.y%p*w%p+p)%p,(a.x*b.y+a.y*b.x)%p);}
complex poweri(complex x,ll b){complex ans=complex(1,0);while(b){if(b&1)ans=ans*x;x=x*x;b>>=1; }return ans;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
bool check(ll a)
{return power(((a*a%p-n)%p+p)%p,k)==(p-1);}
int main()
{srand(31958);scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&p);if(!n){printf("0\n");continue;}if(p==2){printf("%lld\n",n);continue;}k=(p-1)>>1;if(power(n,k)==p-1){printf("Hola!\n");continue;}ll a=rand()%p;while(!check(a))a=rand()%p;w=((a*a%p-n)%p+p)%p;ll x1=poweri(complex(a,1),(p+1)/2).x;ll x2=p-x1;if(x1>x2)swap(x1,x2);if(x1!=x2)printf("%lld %lld\n",x1,x2);else printf("%lld\n",x1);}
}

线性基

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,d[60];
void add(ll x){for(ll i=51;i>=0;i--){if(x&(1ll<<i)){if(d[i])x^=d[i];else{d[i]=x;break;}}}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);add(x);}ll ans=0;for(ll i=51;i>=0;i--)if(ans<(ans^d[i]))ans=ans^d[i];printf("%lld",ans);
}

杜教筛

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const ll N=1e7+1;
ll T,n,cnt,mu[N],phi[N],pri[N];
bool vis[N];
map<ll,ll> sp,sm; 
void prime(){mu[1]=phi[1]=1;for(ll i=2;i<N;i++){if(!vis[i])pri[++cnt]=i,mu[i]=-1,phi[i]=i-1;for(ll j=1;j<=cnt&&pri[j]*i<N;j++){vis[pri[j]*i]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[pri[j]]*phi[i];mu[i*pri[j]]=-mu[i];}}for(ll i=1;i<N;i++)phi[i]+=phi[i-1],mu[i]+=mu[i-1];return;
}
ll GetSphi(ll n){if(n<N)return phi[n];if(sp[n])return sp[n];ll rest=n*(n+1ll)/2ll;for(ll l=2ll,r;l<=n;l=r+1ll)r=n/(n/l),rest-=(r-l+1ll)*GetSphi(n/l);return (sp[n]=rest);
}
ll GetSmul(ll n){if(n<N)return mu[n];if(sm[n])return sm[n];ll rest=1ll;for(ll l=2ll,r;l<=n;l=r+1ll)r=n/(n/l),rest-=(r-l+1ll)*GetSmul(n/l);return (sm[n]=rest);
}
int main()
{scanf("%lld",&T);prime();while(T--){scanf("%lld",&n);printf("%lld %lld\n",GetSphi(n),GetSmul(n));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OIDC(OpenID Connect)的SSO

在[认证授权]系列博客中&#xff0c;分别对OAuth2和OIDC在理论概念方面进行了解释说明&#xff0c;其间虽然我有写过一个完整的示例&#xff08;https://github.com/linianhui/oidc.example&#xff09;&#xff0c;但是却没有在实践方面做出过解释。在这里新开一个系列博客&am…

Consul集群搭建

转载自 Consul集群搭建 概述 作为服务发现的几种产品&#xff0c;比较可以查看这里。Consul官方也提供了几种产品之间的比较&#xff0c;点击查看。 服务发现产品 Consul有很多组件&#xff0c;但总体来说&#xff0c;它是一个发现和配置服务工具&#xff0c;特性&#xff…

js遍历对象的key和value

如果想要得到数组的键值对&#xff0c;可以用以下方法 object {"name":"kejin","age":"18"}for(var index in object){console.log(index);console.log(object[index]); }

亿些模板【字符串+其他】

文章目录前言其他快读快输卡常DataMakerDataMakerDataMaker字符串模板KMP字符串hashTrie最小表示法ManacherAC自动机SASAM广义SAMPAM其他模板凸包模拟退火前言 因为老是懒得打模板的时候老是扣不到自己的标(因为之前的都打得太丑了)&#xff0c;所以导致我十分的不爽。便打算开…

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 第三部分: 使用Identity Server 4建立Authorization Server (3) 第四部分: 使用Identity Server 4建立…

SpringBoot整合kafka(实现producer和consumer)

转载自 SpringBoot整合kafka(实现producer和consumer) 在Windows环境下安装运行Kafka&#xff1a;https://www.jianshu.com/p/d64798e81f3b 本文代码使用的是Spring Boot 2.1.1.RELEASE 版本 <parent><groupId>org.springframework.boot</groupId><art…

js的字符串和变量拼接

使用反引号拼接字符串和变量 let count 1 name 用户${count} console.log(name);注意是反引号不是引号&#xff0c;反引号是Esc下面的一个按键

ASP.NET Core 认证与授权[7]:动态授权

基于资源的授权 有些场景下&#xff0c;授权需要依赖于要访问的资源&#xff0c;例如&#xff1a;每个资源通常会有一个创建者属性&#xff0c;我们只允许该资源的创建者才可以对其进行编辑&#xff0c;删除等操作&#xff0c;这就无法通过[Authorize]特性来指定授权了。因为授…

maven中scope属性的

转载自 maven中scope属性的 Dependency Scope 在POM 4中&#xff0c;<dependency>中还引入了<scope>&#xff0c;它主要管理依赖的部署。目前<scope>可以使用5个值&#xff1a; * compile&#xff0c;缺省值&#xff0c;适用于所有阶段&#xff0c;会随着…

P3384-[模板]树链剖分

正题 题目大意 要求支持路径加和求和&#xff0c;子树加和求和 解题思路 树剖不解释 codecodecode #include<cstdio> #include<algorithm> using namespace std; const int N200000; int tot,cnt,n,m,s,p,ls[N],pw[N],id[N]; int siz[N],dep[N],f[N],son[N],seg…

H5的Websocket基本使用

前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

springboot手动提交kafka offset

转载自 springboot手动提交kafka offset enable.auto.commit参数设置成了false 但是测试发现enable.auto.commit参数设置成了false&#xff0c;kafka的offset依然提交了&#xff08;也没有进行人工提交offset&#xff09;。 查看源码 如果我们enable.auto.commit设置为false…

P2114-[NOI2014]起床困难综合症【位运算】

正题 题目大意 若干个位操作&#xff0c;求一个值xxx使得进行了以后的最大值。 解题思路 每位分开运算计算出每一位为0和为1时的结果&#xff0c;然后贪心选择。 codecodecode // luogu-judger-enable-o2 #include<cstdio> using namespace std; int n,m,ans,t; char …

可观测性与原生云监控

在近日发表的一篇文章中&#xff0c;Cindy Sridharan概括介绍了可观测性及其与原生云应用程序监控的关系。可观测性是一种理念&#xff0c;包括监控、日志聚合、指标和分布式跟踪&#xff0c;可以实时更深入地观察系统。 Sridharan的文章基于她就同一个主题所做的Velocity演讲。…

项目总览地址

写这篇的目的是整理一下最近一段时间写的小demo&#xff0c;我这里稍微自夸一下暂且先叫项目吧&#xff0c;如果服务器不垮台的话&#xff0c;以后还是一直可以看到预览效果的&#xff0c;反正域名和服务器我是不会扔掉的&#xff0c;就怕后面项目多了&#xff0c;服务器承受不…

mybatis3中@SelectProvider的使用技巧

转载自 mybatis3中SelectProvider的使用技巧 mybatis3中增加了使用注解来配置Mapper的新特性&#xff0c;本篇文章主要介绍其中几个Provider的使用方式&#xff0c;他们是&#xff1a;SelectProvider、UpdateProvider、InsertProvider和DeleteProvider。MyBatis 3 User Guide中…

P2766-最长不下降子序列问题【网络流,dp】

正题 题目大意 求最长不下降子序列和可以取出多少以及允许多次使用一些数时可以取出多少个。 解题思路 第一问dp求&#xff0c;且保存以xxx开头的最长长度fxf_xfx​。 第二问考虑网络流。 我们对于每个数字以fif_ifi​的不同分层&#xff0c;然后每次从下往上一层连接&#x…

使用Microsoft.AspNetCore.TestHost进行完整的功能测试

简介 Microsoft.AspNetCore.TestHost是可以用于Asp.net Core 的功能测试工具。很多时候我们一个接口写好了&#xff0c;单元测试什么的也都ok了&#xff0c;需要完整调试一下&#xff0c;检查下单元测试未覆盖到的代码是否有bug。步骤为如下&#xff1a;程序打个断点->F5运行…

MockJs案例

有时候前端写好模板后&#xff0c;后端还完工&#xff0c;那么总不能一直让项目停滞吧&#xff0c;这里就用Mockjs来模拟后端接口的数据&#xff0c;让我们先人一步完成项目。 首先创建一个html&#xff0c;导入axios和mockjs 再用mock去拦截请求&#xff0c;如果后端接口写好了…

JS document.execCommand实现复制功能

转载自 JS document.execCommand实现复制功能 最近项目中需要实现功能&#xff1a;点击button&#xff0c;复制input框的值&#xff1b; 我使用的是 document.execCommand(copy)的方法&#xff1b; 但是很郁闷的是&#xff0c;始终实现不了功能&#xff1b;代码如下 HTML代…