线性筛求素数
| int prime[MAXN]; |
| bool is_not_prime[MAXN] = {1, 1}; |
| |
| |
| void xxs(int n) |
| { |
| for(int i=2;i<=n;i++) |
| { |
| if(!is_not_prime[i]) |
| { |
| prime[++prime[0]]=i; |
| } |
| for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++) |
| { |
| is_not_prime[i*prime[j]]=1; |
| |
| if(i%prime[j]==0) break; |
| } |
| } |
| } |
| |
欧拉函数
求单个
| int euler_phi(int n) |
| { |
| |
| int m=int(sqrt(n + 0.5)); |
| int ans=n; |
| |
| for(int i=2;i<=m;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; |
| } |
求多个
| |
| int n,phi[N],prime[N],tot; |
| bool not_prime[N]; |
| void getPhi() |
| { |
| phi[1]=1; |
| for(int i=2;i<=n;++i) |
| { |
| if(!not_prime[i]) |
| { |
| prime[++tot]=i; |
| phi[i]=i-1; |
| } |
| for(int j=1;j<=tot;++j) |
| { |
| int k=i*prime[j]; |
| if(k>n) break; |
| not_prime[k]=true; |
| if (i % prime[j]==0) |
| { |
| phi[k]=prime[j]*phi[i]; |
| break; |
| } |
| else |
| { |
| phi[k]=(prime[j]-1)*phi[i]; |
| } |
| } |
| } |
| } |
gcd求最大公约数
| |
| int gcd(int x,int y) |
| { |
| return (y==0?x:gcd(y, x%y)); |
| } |
| |
| |
| int gcd(int x,int y) |
| { |
| int r=x % y; |
| while(r) |
| { |
| x=y; |
| y=r; |
| r=x%y; |
| } |
| return y; |
| } |
乘法逆元
费马小定理求逆元
| ll quickpow(ll a,ll n,ll p) |
| { |
| ll ans=1; |
| while(n) |
| { |
| if(n&1) ans=ans*a%p; |
| a=a*a%p; |
| n>>=1; |
| } |
| return ans; |
| } |
| |
| ll niyuan(ll a,ll p) |
| { |
| return quickpow(a,p-2,p); |
| } |
线性求1-n逆元
| |
| ny[1]=1; |
| for(int i=2;i<p;++i) |
| { |
| ny[i]=(long long)(p-p/i)*ny[p%i]%p; |
| } |
中国剩余定理
物不知数问题
| ll crt(int k,ll a[],ll r[]) |
| { |
| ll n=1,ans=0; |
| for(int i=1;i<=k;i++) n=n*r[i]; |
| for(int i=1;i<=k;i++) |
| { |
| ll m=n/r[i],b,y; |
| exgcd(m,r[i],b,y); |
| ans=(ans+a[i]*m*b%n)%n; |
| } |
| return (ans%n+n)%n; |
| } |
扩展中国剩余定理
例题
| |
| #include<bits/stdc++.h> |
| using namespace std; |
| #define ll long long |
| |
| const int maxn=1e5+5; |
| int n; |
| ll h[maxn],l[maxn]; |
| |
| ll fmul(ll a,ll b,ll mod) |
| { |
| ll res=0; |
| while(b) |
| { |
| if(b&1) res=(res+a)%mod; |
| a=(a+a)%mod; |
| b>>=1; |
| } |
| return res; |
| } |
| |
| ll exgcd(ll a,ll b,ll &x,ll &y) |
| { |
| if(b==0) |
| { |
| x=1; |
| y=0; |
| return a; |
| } |
| ll res=exgcd(b,a%b,x,y); |
| ll t=x; |
| x=y; |
| y=t-a/b*y; |
| return res; |
| } |
| |
| ll excrt() |
| { |
| ll ans=0,mul=1,x,y; |
| for(int i=1;i<=n;i++) |
| { |
| ll a=mul,b=l[i],c=(h[i]-ans%b+b)%b; |
| ll g=exgcd(a,b,x,y),bg=b/g; |
| if(c%g!=0) return -1; |
| x=fmul(x,c/g,bg); |
| ans=ans+x*mul; |
| mul=mul*bg; |
| ans=(ans%mul+mul)%mul; |
| } |
| return ans; |
| } |
| |
| int main() |
| { |
| scanf("%d",&n); |
| for(int i=1;i<=n;i++) scanf("%lld%lld",&l[i],&h[i]); |
| printf("%lld\n",excrt()); |
| |
| return 0; |
| } |
卢卡斯定理
求大组合数取模
| |
| ll C(ll n,ll m,ll p) |
| { |
| return n<m?0:fact[n]*inv(fact[m],p)%p*inv(fact[n-m],p)%p; |
| } |
| |
| ll Lucas(ll n,ll m,ll p) |
| { |
| if(m==0) return 1; |
| return (C(n%p,m%p,p)*Lucas(n/p,m/p,p))%p; |
| } |
详解网址
数论基础
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验