转自:https://blog.csdn.net/ctsas/article/details/55000318

内容较多,建议使用目录

容斥原理

集合的并集

设A1,A2...,AnA1,A2...,An是有限集合,则 
|A1⋃A2⋃…⋃An|=∑ni=1|Ai|−∑ni=1∑j>i|Ai⋂Aj|−∑ni=1∑j>i∑k>j|Ai⋂Aj⋂Ak|…+(−1)n|A1⋂A2⋂…⋂An||A1⋃A2⋃…⋃An|=∑i=1n|Ai|−∑i=1n∑j>i|Ai⋂Aj|−∑i=1n∑j>i∑k>j|Ai⋂Aj⋂Ak|…+(−1)n|A1⋂A2⋂…⋂An|

Sylvester公式

给定集合N和具有性质i的集合A1,A2...,AnA1,A2...,An,则 
|A¯¯¯¯1⋂A¯¯¯¯2⋂…⋂A¯¯¯¯n|=|N|−(∑ni=1|Ai|−∑ni=1∑j>i|Ai⋂Aj|…+(−1)n|A1⋂A2⋂…⋂An|)|A¯1⋂A¯2⋂…⋂A¯n|=|N|−(∑i=1n|Ai|−∑i=1n∑j>i|Ai⋂Aj|…+(−1)n|A1⋂A2⋂…⋂An|)

[列题] 区间(S,E]中与n互质的元素个数

设AiAi为n的第i个质因子pipi的倍数的集合且Ai⊆(S,E],i=1,2,3…kAi⊆(S,E],i=1,2,3…k,那么|Ai|=[Epi]−[Spi],|Ai⋂Aj|=[Epipj]−[Spipj]…|Ai|=[Epi]−[Spi],|Ai⋂Aj|=[Epipj]−[Spipj]…,然后套用上面公式即可解决问题了。关键是将这个公式表达出来,有没有发现一共有2n2n项多项式,而且组合数量为奇数时负,组合数量为偶数时符号为正。

LL POIAE(int n,int S,int E){//质因子分解int p[32],u=0;for(int i=2;i*i<=n;i++)if(n%i==0){p[u++]=i;while(n%i==0) n/=i;}if(n>1) p[u++]=n;LL qua=0;for(int i=1;i<1<<u;i++){int cnt=0,com=1;for(int k=0;k<u;k++)if(i>>k&1) cnt++,com*=p[k];qua+=cnt&1?E/com-S/com:-E/com+S/com;}return E-S-qua;
}

欧拉函数φ(n)

欧拉函数φ(n) 是小于等于n且与n互素的正整数的个数,假设n=pα11pα22pα33…pαkkn=p1α1p2α2p3α3…pkαk,则有

φ(n)=n(1−1p1)(1−1p2)(1−1p3)…(1−1pk)φ(n)=n(1−1p1)(1−1p2)(1−1p3)…(1−1pk)

证明:

设AiAi为1到n之间pipi的倍数的集合,i=1,2,3,…,k,则 
φ(n)=|A¯¯¯¯1⋂A¯¯¯¯2⋂…⋂A¯¯¯¯k||A¯1⋂A¯2⋂…⋂A¯k| 
=|N|−(∑ki=1|Ai|−∑ki=1∑j>i|Ai⋂Aj|…+(−1)k|A1⋂A2⋂…⋂Ak|)|N|−(∑i=1k|Ai|−∑i=1k∑j>i|Ai⋂Aj|…+(−1)k|A1⋂A2⋂…⋂Ak|) 
=n−(∑ki=1npi−∑ki=1∑j>inpipj+∑ki=1∑j>i∑h>jnpipjph…+(−1)knp1p2p3…pk)n−(∑i=1knpi−∑i=1k∑j>inpipj+∑i=1k∑j>i∑h>jnpipjph…+(−1)knp1p2p3…pk) 
=n(1−1p1)(1−1p2)(1−1p3)…(1−1pk)n(1−1p1)(1−1p2)(1−1p3)…(1−1pk)

性质:

  • 欧拉函数是积性函数,即是说若m,n互质φ(mn)=φ(m)φ(n)φ(mn)=φ(m)φ(n) 。
  • 若n是质数p的k次幂,φ(n)=φ(pk)=pk−pk−1=(p−1)pk−1φ(n)=φ(pk)=pk−pk−1=(p−1)pk−1,因为除了p的倍数外,其他数都跟n互质。

欧拉函数φ(n) c++实现代码:

我们为了方便根据以上性质将其变形得到

φ(n)=(p1−1)pα1−11(p1−1)pα2−12...(pk−1)pαk−1kφ(n)=(p1−1)p1α1−1(p1−1)p2α2−1...(pk−1)pkαk−1

如此便可写出φ(n)的o(n−−√)o(n) 的代码了。

LL Eular(int n){LL ans=1;for(int i=2;i*i<=n;i++)if(n%i==0){ans*=i-1;n/=i;while(n%i==0) n/=i,ans*=i;}if(n>1) ans*=n-1;return ans;
}

欧拉函数值表筛法

int e[MAX_N];
void Euler(){for(int i=0;i<MAX_N;i++) e[i]=i;for(int i=2;i<MAX_N;i++)if(e[i]==i)for(int k=i;k<MAX_N;k+=i) e[k]=e[k]/i*(i-1);
}

[列1]区间[1,n]与n的最大公约数的和

∑i=1ngcd(i,n)=∑d|nd⋅φ(n/d)∑i=1ngcd(i,n)=∑d|nd⋅φ(n/d)

[列2]

UVA11426 求 ∑ni=1∑nj=i+1gcd(i,j)∑i=1n∑j=i+1ngcd(i,j)

int phi[MAX_N];LL res[MAX_N];
void solve(){//筛法的魅力for(int i=1;i<MAX_N;i++) phi[i]=i;for(int i=2;i<MAX_N;i++)if(phi[i]==i)for(int j=i;j<MAX_N;j+=i)phi[j]=phi[j]/i*(i-1);for(int i=1;i<MAX_N;i++)for(int k=i;k<MAX_N;k+=i)res[k]+=1LL*i*phi[k/i];for(int i=1;i<MAX_N;i++)res[i]+=res[i-1]-i;
}

[列3]

[1,n]与n互素的和

∑gcd(i,n)=1i<ni=n⋅φ(n)/2∑gcd(i,n)=1i<ni=n⋅φ(n)/2


莫比乌斯函数

莫比乌斯函数μ(n)μ(n),在狄利克雷卷积的乘法中与恒等函数互为逆元,μ(1)=1μ(1)=1,对于无平方因子数n=∏ti=1pin=∏i=1tpi有μ(n)=(−1)tμ(n)=(−1)t,对于有平方因子数nn有μ(n)=0μ(n)=0。

o(n−−√)o(n) 的板子

int mu(int n) {int cnt = 0;for(int i = 2; i * i <= n; ++i) {if(n%i == 0) {n /= i;++cnt;if(n%i == 0) return 0;}}if(n > 1) ++cnt;return cnt&1?-1:1;
}

同余

两个整数 a,b,若它们除以正整数 m所得的余数相等,则称 a,b对于模 m同余,记作a≡b(modm)a≡b(modm)

其性质这里不赘述了,可以参看 维基


费马小定理

费马小定理是数论中的一个定理:假如a是一个整数,p是一个质数,那么 ap−aap−a是p的倍数,可以表示为

ap≡a(modp)ap≡a(modp)

如果a不是p的倍数,这个定理也可以写成

ap−1≡1(modp)ap−1≡1(modp)

[列题]计算21002100除以13的余数 
2100≡212×8+4(mod13)≡(212)8⋅24(mod13)≡18⋅16(mod13)≡16(mod13)≡3(mod13)2100≡212×8+4(mod13)≡(212)8⋅24(mod13)≡18⋅16(mod13)≡16(mod13)≡3(mod13) 
则答案为3


欧拉定理

若gcd(a,n)=1gcd(a,n)=1,则

aφ(n)≡1(mod n)aφ(n)≡1(mod n)


扩展欧几里得算法

给予二整数a、b,必存在有整数x、y使得ax + by = gcd(a,b) 
对于这个问题,扩展欧几里得算法能够快速解出使上式成立(x,y),复杂度o(log(n))

int exGcd(int a,int b,int &x,int &y){if (b==0){x=1,y=0;return a;}int q=exGcd(b,a%b,y,x);y-=a/b*x;return q;
}

通过上面代码可以得到一组特解,记为(x0,y0)(x0,y0),那么通解可以表示为

⎧⎩⎨x=x0−b⋅ky=y0+a⋅kk∈Z{x=x0−b⋅ky=y0+a⋅kk∈Z

例题 POJ1061


模逆元

若a⋅b≡1(mod m)a⋅b≡1(mod m),称a和b对于模数m来说互为逆元

定理:a存在模m的乘法逆元的充要条件是gcd(a,m) = 1

证明:

  1. 充分性:由欧拉定理知aφ(m)≡1(mod m)aφ(m)≡1(mod m),那么必有b=aφ(m)−1b=aφ(m)−1 使a⋅b≡1(mod m)a⋅b≡1(mod m)
  2. 必要性:既然a⋅b≡1(mod m)a⋅b≡1(mod m),即有a⋅b−m⋅k=1=k′⋅gcd(a,m),k∈Z,k′∈Za⋅b−m⋅k=1=k′⋅gcd(a,m),k∈Z,k′∈Z成立,即有gcd(a,m)=1gcd(a,m)=1

[例] 已知 a, m, 求b

将定义式改写成

a⋅b−1=m⋅k,k∈Z⇒a⋅b−m⋅k=1,k∈Za⋅b−1=m⋅k,k∈Z⇒a⋅b−m⋅k=1,k∈Z 
利用扩展欧几里得算法不难求得一组解(b′,k′)(b′,k′) 使得

a⋅b′+m⋅k′=gcd(a,m)a⋅b′+m⋅k′=gcd(a,m)

结合定理得 
若gcd(a,m)≠1gcd(a,m)≠1,那么b无解 
若gcd(a,m)=1gcd(a,m)=1,那么b=b′gcd(a,m)=b′b=b′gcd(a,m)=b′

代码

那么也能写出代码了,若无答案返回-1,若有返回最小的正解

int mod_inverse(int a,int m){int x,y;if(exGcd(a,m,x,y)==1) return (m+x%m)%m;return -1
}
  • 1
  • 2
  • 3
  • 4
  • 5

o(n)得出[1,n]的(mod p)逆元

该算法要求所mod p为素数且n< p,记 aa 的逆元表示为 a−1a−1 
设k=p%ik=p%i,假设以求得k−1(modp)k−1(modp),则

i⋅i−1≡k⋅k−1≡1(modp)i⋅i−1≡k⋅k−1≡1(modp) 
⇒i⋅i−1≡(p%i)⋅(p%i)−1(modp)⇒i⋅i−1≡(p%i)⋅(p%i)−1(modp) 
⇒i⋅i−1≡(p−[p/i]⋅i)⋅(p%i)−1(modp)⇒i⋅i−1≡(p−[p/i]⋅i)⋅(p%i)−1(modp) 
⇒i⋅i−1≡((i−1)⋅p+p−[p/i]⋅i)⋅(p%i)−1(modp)⇒i⋅i−1≡((i−1)⋅p+p−[p/i]⋅i)⋅(p%i)−1(modp) 
⇒i⋅i−1≡i⋅(p−[p/i])⋅(p%i)−1(modp)⇒i⋅i−1≡i⋅(p−[p/i])⋅(p%i)−1(modp) 
由于p为素数,则gcd(i,p)=1gcd(i,p)=1,则 
i−1≡(p−[p/i])⋅(p%i)−1(modp)i−1≡(p−[p/i])⋅(p%i)−1(modp)

取[0,p)中的解 
i−1=(p−[p/i])⋅(p%i)−1%pi−1=(p−[p/i])⋅(p%i)−1%p

代码为

int inv[MAXN];
inv[1] = 1;
for (int i = 2; i<MAXN; i++)inv[i] = inv[MOD%i]*(MOD-MOD/i)%MOD;
  • 1
  • 2
  • 3
  • 4

孙子定理(中国剩余定理)

用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:

(S):⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)(S):{x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)

有解的判定条件,并用构造法给出了在有解情况下解的具体形式。

中国剩余定理说明:假设整数m1,m2,...,mnm1,m2,...,mn其中任两数互质,则对任意的整数:a1,...,ana1,...,an,方程组(S)(S)有解,并且通解可以用如下方式构造得到:

  1. 设 M=m1×m2×⋯×mn=∏i=1nmiM=m1×m2×⋯×mn=∏i=1nmi是整数m1,m2,...,mnm1,m2,...,mn的乘积,并设Mi=M/mi,∀i∈{1,2,⋯,n}Mi=M/mi,∀i∈{1,2,⋯,n},即MiMi是除了mimi以外的n − 1个整数的乘积。
  2. 设ti=M−1iti=Mi−1模mimi的逆元: tiMi≡1(modmi),∀i∈{1,2,⋯,n}tiMi≡1(modmi),∀i∈{1,2,⋯,n}。
  3. 方程组(S)(S)的通解形式为:x=a1t1M1+a2t2M2+⋯+antnMn+kM=kM+∑ni=1aitiMi,k∈Z.x=a1t1M1+a2t2M2+⋯+antnMn+kM=kM+∑i=1naitiMi,k∈Z.在模 MM的意义下,方程组 (S)(S)只有一个解: 

    x=∑i=1naitiMi.x=∑i=1naitiMi.

证明

对于 ∀j∈{1,2,⋯,n},j≠i,gcd(mi,mj)=1∀j∈{1,2,⋯,n},j≠i,gcd⁡(mi,mj)=1

考察乘积aitiMiaitiMi可知:

aitiMi≡ai⋅1≡ai(modmi),aitiMi≡ai⋅1≡ai(modmi), 
∀j∈{1,2,⋯,n},j≠i,aitiMi≡0(modmj).∀j∈{1,2,⋯,n},j≠i,aitiMi≡0(modmj).

所以 x=a1t1M1+a2t2M2+⋯+antnMnx=a1t1M1+a2t2M2+⋯+antnMn 满足:

∀i∈{1,2,⋯,n},x=aitiMi+∑j≠iajtjMj≡ai+∑j≠i0≡ai(modmi).∀i∈{1,2,⋯,n},x=aitiMi+∑j≠iajtjMj≡ai+∑j≠i0≡ai(modmi).

到此以得证(S)(S)的一个解x=∑ni=1aitiMi.x=∑i=1naitiMi.

通解

假设 x1x1和x2x2都是方程组 (S)(S)的解,那么:

∀i∈{1,2,⋯,n},x1−x2≡0(modmi).∀i∈{1,2,⋯,n},x1−x2≡0(modmi).,即 ∀mi|x1−x2∀mi|x1−x2

即 ∏ni=1mi|x1−x2∏i=1nmi|x1−x2,即 M|x1−x2M|x1−x2

到此说明方程组 (S)(S) 的任何两个解之间必然相差MM的整数倍,则通解可表示为

{kM+∑i=1naitiMi;k∈Z}.{kM+∑i=1naitiMi;k∈Z}.

代码

LL CRT(int *m,int *a,int n){LL M=1,ans=0,x,t_i;for (int i=1;i<=n;i++) M*=m[i];for (int i=1;i<=n;i++){LL M_i=M/m[i];exGcd(m[i],M_i,x,t_i);     //求 M_i 模 m[i] 的逆元 t_ians=(ans+a[i]*t_i*M_i)%M;}return ans;
}

矩阵

数学上,一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号或数学式。

大小相同(行数列数都相同)的矩阵之间可以相互加减,具体是对每个位置上的元素做加减法。矩阵的乘法则较为复杂。两个矩阵可以相乘,当且仅当第一个矩阵的列数等于第二个矩阵的行数。矩阵的乘法满足结合律和分配律,但不满足交换律。

矩阵乘法

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为 m×nm×n矩阵,B为n×pn×p矩阵,则他们的乘积AB(有时记做A · B)会是一个 m×pm×p矩阵。其乘积矩阵的元素如下面式子得出:

(AB)ij=∑r=1nairbrj=ai1b1j+ai2b2j+⋯+ainbnj.(AB)ij=∑r=1nairbrj=ai1b1j+ai2b2j+⋯+ainbnj.

矩阵快速幂

类比快速幂不难的到矩阵快速幂,若有矩阵a,则求 anan 代码如下

int N;
struct matrix{LL m[MAX_N][MAX_N];};
matrix multi(matrix a,matrix b){matrix tmp;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++){tmp.m[i][j]=0;for(int k=1;k<=N;k++)tmp.m[i][j]+=a.m[i][k]*b.m[k][j];tmp.m[i][j]%=MOD;}return tmp;
}
matrix fast_mod(matrix a,int n){matrix res;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)res.m[i][j]=(i==j);while(n){if(n&1) res=multi(res,a);a=multi(a,a);n>>=1;}return res;
}

线性递推关系与矩阵乘法

设数列 {hn}{hn} 满足 kk 阶常系数线性递推关系:

hn=C1hn−1+C2hn−2+C3hn−3+⋅⋅⋅+Ckhn−k+bnhn=C1hn−1+C2hn−2+C3hn−3+···+Ckhn−k+bn

bnbn 可以为常数,也可以是关于n的函数

若 bnbn 为常数,则构造转移矩阵

M=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜C1100⋮00C2010⋮00C3001⋮00⋯⋯⋯⋯⋱⋯⋯Ck−1000⋮10Ck000⋮00bn00001⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟(k+1)×(k+1)M=(C1C2C3⋯Ck−1Ckbn100⋯000010⋯000001⋯000⋮⋮⋮⋱⋮⋮000⋯100000⋯001)(k+1)×(k+1)

与初始向量

X=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hk−1hk−2hk−3⋮h2h1h01⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟(k+1)×1X=(hk−1hk−2hk−3⋮h2h1h01)(k+1)×1

易见

Y=MX=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜C1100⋮00C2010⋮00C3001⋮00⋯⋯⋯⋯⋱⋯⋯Ck−1000⋮10Ck000⋮00bn00001⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hk−1hk−2hk−3⋮h2h1h01⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hkhk−1hk−2⋮h3h2h11⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟Y=MX=(C1C2C3⋯Ck−1Ckbn100⋯000010⋯000001⋯000⋮⋮⋮⋱⋮⋮000⋯100000⋯001)(hk−1hk−2hk−3⋮h2h1h01)=(hkhk−1hk−2⋮h3h2h11)

事实上我们可以发现,对于任意的 k 阶常系数线性递推关系,我们总可以构造一个 k×k 或 (k+1)×(k+1) 的转移矩阵 M, 对于初始值向量

X=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hk−1hk−2hk−3⋮h2h1h0⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟k×1或⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜hk−1hk−2hk−3⋮h1h0bn⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟(k+1)×1X=(hk−1hk−2hk−3⋮h2h1h0)k×1或(hk−1hk−2hk−3⋮h1h0bn)(k+1)×1

使得 Y=Mn−k+1X,YY=Mn−k+1X,Y第一行第一列的元素恰好为 hnhn。

利用矩阵乘法计算递推数列的某一项代码

使用上面的两个知识点就不难敲出代码了

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define MAX_N 10
#define MOD 1000000007
using namespace std;
typedef long long LL;
int N;LL b_n=0,C[MAX_N],h[MAX_N];
struct matrix{LL m[MAX_N][MAX_N];};
matrix multi(matrix a,matrix b){matrix tmp;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++){tmp.m[i][j]=0;for(int k=1;k<=N;k++)tmp.m[i][j]+=a.m[i][k]*b.m[k][j];tmp.m[i][j]%=MOD;}return tmp;
}
matrix fast_mod(matrix a,int n){matrix res;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)res.m[i][j]=(i==j);while(n){if(n&1) res=multi(res,a);a=multi(a,a);n>>=1;}return res;
}
void init(matrix &res,matrix &H){for(int i=1;i<=N;i++) res.m[1][i]=C[i];res.m[1][N]=b_n;for(int i=2;i<=N;i++)for(int j=1;j<=N;j++)res.m[i][j]=(i==j+1);res.m[N][N-1]=0;res.m[N][N]=1;for(int i=1;i<=N;i++){H.m[i][1]=h[N-i];for(int j=2;j<=N;j++) H.m[i][j]=0;}H.m[N][1]=1;
}
void slove(int k,int n){matrix res,H;init(res,H);res=fast_mod(res,n-k+1);res=multi(res,H);LL ans=res.m[1][1];printf("%lld\n",ans);
}int main()
{int k,n;while(scanf("%d%d",&n,&k)!=EOF){for(int i=1;i<=k;i++) scanf("%lld",&C[i]);for(int i=1;i<=k;i++) scanf("%lld",&h[i]);N=k+1;slove(k,n);}return 0;
}

例题 51NOD 1126

《挑战》上的矩阵快速幂模板

以斐波那契数列第n项为例

#include<stdio.h>
#include<vector>
using namespace std;typedef long long LL;
typedef vector<LL> vec;
typedef vector<vec> mat;
const LL MOD = 1000000009;mat mul(mat &A,mat &B){mat C(A.size(),vec(B[0].size()));for(int i=0;i<A.size();++i){for(int k=0;k<B.size();++k){for(int j=0;j<B[0].size();++j)C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;}}return C;
}mat pow(mat A,LL n){mat B(A.size(),vec(A.size()));for(int i=0;i<A.size();++i) B[i][i]=1;while(n){if(n&1) B=mul(B,A);A=mul(A,A);n>>=1;}return B;
}int main()
{mat A(2,vec(2));A[0][0]=A[0][1]=A[1][0]=1;A[1][1]=0;LL n;scanf("%lld",&n);A=pow(A,n);printf("%lld\n",A[1][0]);return 0;
}

其他

约数个数

仍何一个整数n都可以表示成n=pa11pa22...pakkn=p1a1p2a2...pkak,那么,n的约数个数

∑d|n1=(a1+1)(a2+1)...(ak+1)∑d|n1=(a1+1)(a2+1)...(ak+1)

例题 LOJ1341

a的k次幂前n位数

用该方法要注意精度

ak=10lgak=10k⋅lga=10[k⋅lga]+{k⋅lga}前n位:[10n−1⋅10{k⋅lga}]ak=10lg⁡ak=10k⋅lg⁡a=10[k⋅lg⁡a]+{k⋅lg⁡a}前n位:[10n−1⋅10{k⋅lg⁡a}]

例题 LOJ1282

定积分

Simpson`s 3/8 rule

const double eps=1e-8;
inline double f(double x){return x*x;//被积函数
}
inline double getAppr(double a,double b){//Simpson`s 3/8 rulereturn (b-a)*(f(a)+3*f((2*a+b)/3)+3*f((a+2*b)/3)+f(b))/8.0;
}
double simpson(double l,double r){//积分区间[l,r]double sum=getAppr(l,r);double mid=(l+r)/2;double suml=getAppr(l,mid);double sumr=getAppr(mid,r);return fabs(sum-suml-sumr)<eps?sum:simpson(l,mid)+simpson(mid,r);
}

例题 地狱飞龙


线性筛法筛素数、莫比乌斯函数、欧拉函数

线性筛法(欧拉筛法)可以在 O(n) 的时间内获得 [1,n] 的所有素数。算法保证每个合数都会被它的最小质因子筛掉,所以复杂度是线性的。同时,我们可以利用这一特性,结合积性函数的性质,在 O(n)的时间内筛出一些积性函数的值。

bool isNotPrime[MAXN + 1];
int mu[MAXN + 1], phi[MAXN + 1], primes[MAXN + 1], cnt;
inline void euler()
{isNotPrime[0] = isNotPrime[1] = true;mu[1] = 1;phi[1] = 1;for (int i = 2; i <= MAXN; i++) {if (!isNotPrime[i]) {primes[++cnt] = i;mu[i] = -1;phi[i] = i - 1;}for (int j = 1; j <= cnt; j++) {int t = i * primes[j];if (t > MAXN) break;isNotPrime[t] = true;if (i % primes[j] == 0) {mu[t] = 0;phi[t] = phi[i] * primes[j];break;} else {mu[t] = -mu[i];phi[t] = phi[i] * (primes[j] - 1);}}}
}

本文章不定期更新

如有谬误,恳请指正

与程序竞赛有关的数学知识点相关推荐

  1. 微分方程的数值解法与程序实现 pdf_初中数学知识点|一元一次方程的概念及讲解(二)建议收藏!内含pdf版...

    长按关注[初中数学解题大全] 获取更多! 电子课本|学习资料|学习方法|家教知识 后台回复"数学"等学科名称即可获取初中数学电子课本 后台回复"初一"等相应年级 ...

  2. 挑战程序竞赛系列(41):4.1中国剩余定理

    挑战程序竞赛系列(41):4.1中国剩余定理 详细代码可以fork下Github上leetcode项目,不定期更新. 练习题如下: POJ 1006: Biorhythms POJ 2891: Str ...

  3. 那些程序跑动中冷僻的知识点(上)

    作为像老猫一样的土著程序员,只懂随时发车却不懂如何修车,放弃了基础理论容易翻车,刚巧最近看了半天关于程序运行的书籍,咱分两期聊一聊<那些程序跑动中冷僻的知识点>. 定场诗:广知世事休开口, ...

  4. 机器学习与深度学习中的数学知识点汇总

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,每天 8:25 送达 来源:SIGAI 在机器学习与深度学习中需要大量使 ...

  5. 软件学院学生在数据管理国际会议SIGMOD程序竞赛中喜获佳绩

    5月17日,数据管理领域国际顶级学术会议ACM SIGMOD程序竞赛结果公布,清华大学软件学院3名研究生梅逸男.王浩宇.赵东明组成的参赛队伍(UKN)获得了第2名的好成绩,带队教师为宋韶旭副教授. 本 ...

  6. python求分段函数值_高中数学知识点整理(2)——函数概念及基本初等函数篇(上)...

    大家好!我是高考数学易老师,今天是我来知乎的第二天,今天更新函数概念及基本初等函数知识点.如果有任何关于高中数学知识点,可随时询问呢. 函数 1. 函数与映射(1) 函数的概念 设 是两个非空的数集, ...

  7. c语言程序竞赛,2015年江西理工大学C语言程序设计竞赛(初级组)

    JankTao相亲记 解法:排序 #include #include #include #include #include #include #include #include using names ...

  8. 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答

    [2020年第12届全国大学生数学竞赛--资源分享 ][1~11届省赛决赛考题及题解(数学类.非数学类).推荐学习网址.复习备考书籍推荐] 2019年 第11届 全国大学生数学竞赛 初赛(非数学类)试 ...

  9. 数学知识点大集合!有了它学数学真的很简单!

    ▲ 点击查看 很多学生对于数学这门学科都有莫名的恐惧感,不知道怎样学才能学得好.其实,好的方法能让学习效率达到最佳效果.有的时候,孩子学习不好,真的不是因为孩子笨,而是这种方法不适合孩子. 其实小学数 ...

最新文章

  1. 计算机科学家证明,为什么更大的神经网络可以做得更好
  2. 1.5 成员方法的声明和调用,形参,实参
  3. MySQL zip压缩包安装
  4. 【Linux】一步一步学Linux——初识Linux命令解析器(10)
  5. FPGA机器学习之stanford机器学习第三堂1
  6. fgetc与EOF的错综复杂关系
  7. 1333和1600能双通道吗_波音797何时到来?会成为A321XLR的竞争对手吗?
  8. 【Oracle】创建角色
  9. 【Linux】linux经常使用基本命令
  10. 2018-2019-1 20189204《Linux内核原理与分析》第二周作业
  11. 以字型为例,一维表示的二维数组矩阵,旋转90、-90
  12. 记录一下树莓派使用qBittorrent做种走弯路
  13. gcc下载地址(Linux/windows安装)
  14. 最新Latex安装详细教程
  15. Ubuntu下用snap7与西门子通信
  16. Cramer`s Rule 克莱姆法则(克拉默法则)
  17. 几款流行的电路仿真软件简介与学习资源分享
  18. php用哪个ui框架好,常用的前端UI框架有哪些
  19. C.Lorenzo Von Matterhorn(思维+朴素lca思想)
  20. m451dn linux驱动下载,惠普M451dn驱动下载

热门文章

  1. 计算机d类事业单位题,事业单位计算机简答实务大题.doc
  2. 英特尔530和535哪个好_2020联想小新Air 14英特尔版和锐龙版怎么选,有什么区别...
  3. Win10配置JDK
  4. 企业品牌推广做好这七点快速开启软文营销之旅
  5. MTK的Flashtool 加载scatter-loading是报错
  6. NeRF衍生项目,谷歌用Waymo自动驾驶汽车打造3D数字城市
  7. R-CNN论文中文翻译(精校版)
  8. 谁说程序员不懂浪漫——我的C语言结婚请柬(附源码)
  9. win7关闭计算机控制,大吼:鹅要关机!Win7下语音控制电脑攻略
  10. SequoiaDB 巨杉数据库 学习-高可用与容灾