标签:
欧几里得求公约数:
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