ACM模版——数学相关
//===========================================\\
| 打印素数表 |
\\===========================================//
int prime[100001],pcount=1;
bool s[1300000]; //可直接判断是否素数
void pri()
{
int i,j;
memset(s,true,sizeof(s));
prime[1]=2;
for ( i=3; i<=1299709; i+=2 )
{
if ( s[i] )
{
prime[++pcount]=i;
for ( j=2; i*j<=1299709; j++) s[i*j]=false;
}
}
}
|
n |
Prime[n] |
n |
Prime[n] |
|
100 |
541 |
700 |
5279 |
|
150 |
863 |
1000 |
7919 |
|
200 |
1223 |
5000 |
48611 |
|
250 |
1583 |
10000 |
104729 |
|
300 |
1987 |
50000 |
611953 |
|
500 |
3571 |
100000 |
1299709 |
//===========================================\\
| 欧拉函数 |
\\===========================================//
int Euler[100001]; //打印欧拉函数表
void Eu()
{
memset(Euler,0,sizeof(Euler));
Euler[1]=1;
for (int i=1; i<=100000; i++)
if ( !Euler[i] )
for (int j=i; j<=100000; j+=i)
{
if ( !Euler[j] ) Euler[j]=j;
Euler[j]=Euler[j]/i*(i-1);
}
}
- - - - - - - - - - - - - - - - - - - - - - -
int Euler(int x) //若无打印素数表,i替换prime[i]
{
int i,temp=x;
if ( x==1 ) return 1;
else
{
for (i=1; prime[i]*prime[i]<=x; i++)
if ( x%prime[i]==0)
{
temp=temp/prime[i]*(prime[i]-1);
while ( x%prime[i]==0 ) x/=prime[i];
}
if ( x>1 ) temp=temp/x*(x-1);
return temp;
}
}
//===========================================\\
| GCD求最大公约数 |
\\===========================================//
int gcd (int a,int b)
{
for (int t; t=a%b; a=b, b=t);
return b;
}
//===========================================\\
| 扩展GCD,求 ( x , y )使得gcd ( a , b )=ax+by |
\\===========================================//
// g=gcd(a,b),其余解(x0+kb/g, y0-ka/g),k为整数
// x0不一定为正数,输入的a、b均可为负数
void extgcd(int a,int b)
{
if ( !b ) { g=a; x=1; y=0; }
else { extgcd(b,a%b); int t=x; x=y; y=t-x*(a/b); }
}
/============================================\\
| 中国剩余定理 |
\\===========================================//
// ans=b( mod w),gcd(wi,wj)=1
int china(int b[],int w[],int l,int r)
{
int i,ans=0,s=1,m;
for (i=l; i<=r; i++) s*=w[i];
for (i=l; i<=r; i++)
{
m=s/w[i];
extgcd(w[i],m);
ans=(ans+y*m*b[i])%s;
}
if ( ans>0 ) return ans;
else return ans+s;
}
//===========================================\\
| 求x^n mod k |
\\===========================================//
int powmod(int x,int n,int k)
{
if ( n<=1 ) return x%k;
int a=powmod(x,n/2,k);
long long ans=a*a%k;
if ( n%2 ) ans=ans*x%k;
return int(ans);
}
//===========================================\\
| 阶乘最后非0位 |
\\===========================================//
int lastdigit(char* buf)
{
Int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
int len=strlen(buf),a[1000],i,c,ans=1;
if ( len==1 ) return mod[buf[0]-'0'];
for (i=0; i<len; i++) a[i]=buf[len-i-1]-'0';
for ( ; len; len-=!a[len-1])
{
ans=ans*mod[a[1]%2*10+a[0]]%5;
for (c=0,i=len-1; i>=0; i--)
{
c=c*10+a[i];
a[i]=c/5;
c%=5;
}
}
return ans+ans%2*5;
}
//===========================================\\
| 求和公式 k = 1,2,3,….,n |
\\===========================================//
Sum(k)= n(n+1)/2
Sum(2k-1)= n^2
Sum(k^2)= n(n+1)(2n+1)/6
Sum((2k-1)^2)= n(4n^2-1)/3
Sum(k^3)= (n(n+1)/2)^2
Sum((2k-1)^3)= n^2(2n^2-1)
Sum(k^4)= n(n+1)(2n+1)(3n^2+3n-1)/30
Sum(k^5)= n^2(n+1)^2(2n^2+2n-1)/12
Sum(k(k+1))= n(n+1)(n+2)/3
Sum(k(k+1)(k+1))= n(n+1)(n+2)(n+3)/4
Sum(k(k+1)(k+2)(k+3))= n(n+1)(n+2)(n+3)(n+4)/5
//===========================================\\
| 组合公式 |
\\===========================================//
C(n, r) = C(n, n-r)
C(n+1, r+1) = C(n, r+1)+C(n, r) //杨辉三角
C(n, r) C(r, m)=C(n, m)C(n-m, r-m)=C(n, k-m)C(n-k+m, m)
K*C(n, k)=(n-k+1)*C(n, k-1)
k*C(n, k)=n*C(n-1, k-1)
C(n, 0)+C(n, 1)+C(n, 2)+…+C(n, n)=2^n
C(n, 0)-C(n, 1)+C(n, 2)+…+(-1)^n*C(n, n)=0
//===========================================\\
| C(n, r) |
\\===========================================//
int C(int n,int r)
{
int i,ans=1;
if ( n-r<r ) r=n-r;
for (i=1; i<=r; i++) ans=ans*(n-i+1)/i;
return ans;
}
//===========================================\\
| Catalan数 |
\\===========================================//
h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…+h(n-1)h(0) (n>=2)
h(n)=h(n-1)*(4n-2)/(n+1)=C(2n,n)/(n+1)
前几项:h(0)=1、h(1)=1、2、5、14、42、132、429、1430、4862、16796、58786、208012、742990
1、 长度2n的dyck word的个数。Dyck word:由n个X、Y组成的字串,且所有的前缀字串皆满足X的个数大于等于Y的个数。(若将XY换成(),计算合法运算式的个数)
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
2、 有n个节点组成不同构二叉树的方案数。
3、 通过连结顶点而将n + 2边的凸多边形分成三角形的方法个数。
4、 对{1, ..., n}依序进出栈的置换个数。
用n个矩形填充一个高度为n的阶梯状图形的方法个数。(非轴对称的算2个)
浙公网安备 33010602011771号