话说当初我不选择数学竞赛与其他竞赛的原因,就是我以为信息学竞赛有关数学的方面不怎么较难。结果到数论时,我就GG了,所以这次借着复习,巩固数论。
(注:本文以实用和总结为主,大部分定理与公式是没有证明的)
void Prime(int n)//
{
cnt=0;//cnt从零开始
memset(vis,0,sizeof(vis));
for(int i=2;i
其实还可以用这个来求每个数的最小质因子,稍作修改即可(推荐:BZOJ3233)
void Prime(int num)
{
cnt=0;
memset(minn,0,sizeof(minn));
for(int i=2;i<=num;i++)
{
if(!minn[i])
{
prime[cnt++]=i;
minn[i]=i;
}
for(int j=0;j
int gcd(int a,int b)//最大公约数
{
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b)//最小公倍数
{
return a/gcd(a,b)*b;//注意:这里应该先除后乘,减少溢出的可能
}
int pow(int base,int b)//建议使用循环,而不用递归(容易崩栈!血的教训!)
{
int res=1;
while(b)
{
if(b&1) res=res*base%mod;
base=base*base%mod;
b>>=1;
}
return res;
}
void gcd(int a,int b,int g,int &x,int &y)
{
if(!b) {g=a;x=1;y=0;}
else {gcd(b,a%b,g,y,x);y-=x*(a/b);}
}
void C(int n,int m)
{
/*1.*/for(int i=1;i<=n;i++)
{
f[i][i]=f[i][0]=1;
for(int j=1;j<=i;j++)
{
f[i][j]=f[i-1][j]+f[i-1][j-1];//排列数的递推公式
}
}//递推式
/*2.*/f[n][m]=n!/m!(n-m)!//公式,可以预处理阶乘,但由于要用除法,n和m太大后要溢出,
//取模又没有除法运算(但有逆元),总之就是比较蛋疼的算法
/*3.*/c[0]=1;利用C(n,k)=(n+1-k)/k*C(n,k-1)
for(int i=1;i<=n;i++)c[i]=c[i-1]*(n-i+1)/i;实际意义不明显,但。。。很好玩
}
以上就是一部分笔者觉得重要的基础,虽然应用感觉很少,但是接下来大多数都建立在这些之上,至少把代码记住还是很重要的。