标签:
欧几里得求公约数:
int gcd(int a, int b) { while (b) { int tmp = b; b = a % b; a = tmp; } return a; }
筛选法求素数:
int prime() { memset(vis, true, sizeof(vis)); for(int i = 2; i <= sqrt(N +0.5); i++) if(vis[i]) for(int j = i << 1 ; j <= N; j += i) vis[j] = false; int k=0; for(int i = 2 ; i <= N; i++) if(vis[i]) pri[k++]=i; }
杨辉三角求组合数:
方法1:
memset(c,0,sizeof(c)); c[0]=1; repu(i,1,sum+1) c[i]=c[i-1]*(sum-i+1)/i;
方法2:
memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { c[i][0]=1; for(int j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; }
求欧拉数
mem(phi,0); phi[1]=1; for(int i=2; i<=N; i++) { if(!phi[i]) { for(int j=i; j<=N; j+=i) { if(!phi[j]) phi[j]=j; phi[j]=phi[j]/i*(i-1); } } }
快速幂取模
ll pow_mod(ll x, ll y) { ll ans = 1; while (y > 0) { if (y & 1) ans = ans * x % mod; y >>= 1; x = x * x % mod; } return ans; }
统计数字模板:
void count_digits(int s,int ans[],int times=1) { int i,d,p; if (s <= 0) return ; d = s % 10; p = s / 10; for (i = 1; i <= d; i ++) ans[i] += times; while(p > 0) { ans[p % 10] += (d + 1) * times; p = p / 10; } for (i = 0; i <= 9; i ++) ans[i] += times * (s / 10); times *= 10; count_digits((s / 10)-1,ans,times); return ; }
分解质因子:
void tran(int n,int a[]) { repu(j,2,n+1) { int k=j; for(int i=0; i<1229; i++) { while(k%pri[i]==0) { k/=pri[i]; a[i]++; } if(k==1) break; } } }
标签:
原文地址:http://www.cnblogs.com/ACMERY/p/4332863.html