数论
数论
第一节:快速乘法
ll CF(ll a,ll b,ll p)
{
a%=p,b%=p;
ll ans=0;
do{
if(a&1)
(ans+=b)%=p;
(b*=2)%=p;
}while(a>>=1);
return ans;
}
第二节:快速幂
int Pow(int a,int b)
{
int ans=1;
do{
if(b&1)
ans*=a;
a*=a;
}while(b>>=1);
return ans;
}
第三节:线性筛素数
for(i=2;i<m;i++)
{
if(!a[i]) prime[num_prime++]=i;
for(j=0;j<num_prime && i*prime[j]<m;j++)
{
a[i*prime[j]]=1;合数标为1,同时,prime[j]是合数i*prime[j]的最小素因子
if(!(i%prime[j])) break;
即比一个合数大的质数和该合数的乘积可用
一个更大的合数和比其小的质数相乘得到
}
}
第四节:排列组合
可重排列:n^m
不可重排列:n!/(n-m)!
组合:n!/((n-m)!*m!)
组合数线性递推:C(n,i)=C(n,i-1)*(n-i+1)/i;
组合数求和:C(n,0)+C(n,1)+C(n,2)+…+C (n,n)=2^n