# 筛选质因子
| for(int i=2;i*i<=k;i++){ |
| if(k%i==0){ |
| p[++tail]=i; |
| while(k%i==0) k/=i; |
| } |
| } |
| if(k>1) p[++tail]=k; |
# 判断是否为质数
| bool isp(int n){ |
| if(n==1||n==0) return 0; |
| if(n==2||n==3) return 1; |
| if(n%6!=1&&n%6!=5) return 0; |
| for(int i=5;i*i<=n;i+=6){ |
| if(n%i==0||n%(i+2)==0) return 0; |
| } |
| return 1; |
| } |
# 容斥原理
前言:
- 计算 1-n 中 m 的的倍数的数量时,直接 n/m
- 容斥原理是在互质的数的基础上实现的
公式:
(A+B+C+D+E……)-(AB+AC+AD……+BC+BD)+(ABC+BCD……)-(ABCD+BCD*E……)……
规律: 奇数相加,偶数相减
代码:
| p数组储存的是筛选的质因子 |
| long long fun(long long x){ |
| long long res=0; |
| for(int i=1;i<(1<<tail);i++){ |
| long long cur=1,cnt=0; |
| for(int j=0;j<tail;j++){ |
| if((i>>j)&1){ |
| cnt++; |
| cur*=p[j+1]; |
| } |
| } |
| if(cnt&1) res+=x/cur; |
| else res-=x/cur; |
| } |
| return x-res; |
| } |
# 欧拉筛
| int vis[maxn],p[maxn/10]; |
| int cnt=0; |
| void prime() |
| { |
| vis[1]=1; |
| for(int i=2;i<=maxn;i++){ |
| if(!vis[i]) p[++cnt]=i; |
| for(int j=1;j<=cnt&&i<=maxn/p[j];j++){ |
| vis[i*p[j]]=1; |
| if(i%p[j]==0) break; |
| } |
| } |
| } |
# 埃式筛
| int p[1000]; |
| void prime() |
| { |
| vis[1]=1; |
| for(int i=2;i<=n;i++){ |
| if(!vis[i]){ |
| p[++cnt]=i; |
| for(int j=2*i;j<=n;j+=i){ |
| vis[j]=1; |
| } |
| } |
| } |
| } |
# 数学公式
- 海伦公式
S=sqrt (p * (p-a) * (p-b) * (p-c))
# 快速幂
非递归版本int p(int a,int b){
int t,y;
t=1; y=a;
while (b!=0){
if (b&1==1) t=t*y%MOD;
y=y*y%MOD;
b=b>>1;
}
return t;
}
递归版本 | ll pow(ll a,ll i){ |
| if (i==0) return 1; |
| ll temp=pow(a,i>>1)%MOD; |
| temp=temp*temp%MOD; |
| if (i&1) temp=temp*a%MOD; |
| return temp%MOD; |
| } |
# 龟速乘 (快速幂 BUG)
| ll gsc(ll a,ll b){ |
| ll ans=0; |
| while(b){ |
| if(b&1) ans=(ans+a)%MOD; |
| a=a*2%MOD; |
| b>>=1; |
| } |
| return ans; |
| } |
# 快速乘 (有误差)
| cin>>a>>b>>mod; |
| cout<<((a*b-(long long)((long double)a*b/mod)*mod+mod)%mod); |
# 树状数组模板
| int lowbit(int n){ |
| return n&-n; |
| } |
| |
| void add(int x,int y,int n){ |
| for(int i=x;i<=n;i+=lowbit(i)) |
| c[i] += y; |
| } |
| |
| int getsum(int x){ |
| int ans = 0; |
| for(int i=x;i;i-=lowbit(i)) |
| ans += c[i]; |
| return ans; |
| } |
# 查并集
| void init(int n) { |
| for(int i = 1; i <= n; i++) { |
| f[i] = i; |
| } |
| } |
| |
| int getFriend(int v) { |
| if(f[v] == v) { |
| return v; |
| } |
| return f[v] = getFriend(f[v]); |
| } |
| |
| void merge(int a, int b) { |
| int t1 = getFriend(a); |
| int t2 = getFriend(b); |
| if(t1 != t2) { |
| f[t2] = t1; |
| } |
| } |
# 快速排序
| |
| int qsort(int l,int r,int *v){ |
| int mid=(l+r)>>1; |
| int i=l,j=r; |
| int temp=v[mid]; |
| while(i<=j){ |
| while(v[j]>temp) j--; |
| while(v[i]<temp) i++; |
| if(i<=j){ |
| swap(v[i],v[j]); |
| i++; j--; |
| } |
| } |
| |
| if(i<r) qsort(i,r,v); |
| if(j>l) qsort(l,j,v); |
| } |
# 组合数打表 (杨辉三角)
int类型最多到33层,34层开始爆int,ll最多50层左右,打表最多1e3的量 | int c[50][50]; |
| int zuhe(){ |
| c[0][0]=1; |
| c[1][0]=1;c[1][1]=1; |
| for(int i=2;i<=33;i++){ |
| c[i][0]=1; |
| for(int j=1;j<=i;j++){ |
| c[i][j]=c[i-1][j-1]+c[i-1][j]; |
| } |
| } |
| } |
持续更新中……