Skip to content

Commit a4fc515

Browse files
committed
增加了数论、高等数学内容
1 parent 4c0718b commit a4fc515

12 files changed

Lines changed: 1236 additions & 23 deletions

README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
## 模板简介
1414

15-
这是一份适用于算法竞赛的 C++ 为主的代码模板集合。主要使用于 ICPC区域赛/CCPC ,可用作打印用途,收录铜牌算法和银牌算法,可能不收录过于基础的内容,也不收录过难的内容。不定期更新。
15+
这是一份适用于算法竞赛的 C++ 为主的代码模板集合。主要使用于 ICPC区域赛/CCPC 作比赛时参考资料,可打印,收录铜牌算法和银牌算法,可能不收录过于基础的内容,也不收录过难的内容。不定期更新。
1616

17-
如果您对本模板的内容增删改有任何意见或建议,欢迎您随时提出 >_<
17+
本模板主要浓缩提炼自我的算法笔记(三份笔记,折合约28.5万+2.5万+5万=36万字(含代码)),因时间仓促,难免可能产生纰漏,如果您发现了任何错误之处或者如果您对本模板的内容增删改有任何意见或建议,欢迎您随时提出 >_<
1818

1919
> 目前版本使用 Typora 生成,有生之年也许考虑使用 LaTeX 重做本模板。碍于本人技术有限,目前目录页码是手动制作的,因此可能会出现页码不正确 //欢迎纠正
2020
@@ -31,23 +31,36 @@
3131
- 22/03/24
3232
- 开始模板编制工作
3333
- 增加部分数学公式、大部分 STL 内容
34+
3435
- 22/03/25
3536
- 补充 STL 内容
3637
- 增加排序、组合数学、快读快写、高精度、树
38+
3739
- 22/03/26
3840
- 补充树内容
3941
- 增加线段树、树状数组、平衡树等数据类型
42+
4043
- 22/03/28
4144
- 增加加权并查集内容
45+
4246
- 22/03/29
4347
- 增加整体二分、LIS、前缀和/差分内容
4448
- 增加了搜索、二分答案内容
49+
4550
- 22/03/30
4651
- 增加了zkw线段树、猫树、K-D Tree内容,修改了部分内容
4752
- 增加了图概念、最短路内容
53+
4854
- 22/03/31
4955
- 增加了拓扑排序、最小生成树、二分图匹配、网络流内容
56+
5057
- 22/04/01
58+
5159
- 增加了图的连通性、组合数学、数学杂项内容
5260

61+
- 22/04/02
62+
63+
- 增加了数论主要内容、高等数学内容
64+
65+
5366

code/eg_euler.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ln;
4+
typedef int ll;
5+
#define mn 10000002
6+
#define mod 1000000007
7+
ll n, k, p[mn], pri[mn], e[mn], pe[mn], g[mn], cnt; ln ans = 1;
8+
void euler(ll n)
9+
{//e[i]是i质因数分解得到的最大的幂a_i,pe[i]是对应最大的(p^e[i])
10+
for(ll i=2;i<=n;++i)
11+
{
12+
if (!p[i]) p[i] = i, pri[++cnt] = i, pe[i] = i, e[i] = 1;
13+
for (ll j = 1; i * pri[j] <= n; ++j)
14+
{
15+
p[i * pri[j]] = pri[j];
16+
if (pri[j] == p[i])
17+
{
18+
e[i * pri[j]] = e[i] + 1;
19+
pe[i * pri[j]] = pe[i] * pri[j];
20+
break;
21+
}
22+
e[i * pri[j]] = 1;
23+
pe[i * pri[j]] = pri[j];
24+
}
25+
}
26+
}
27+
ln qpow(ln a, ln b)
28+
{
29+
ln res = 1;
30+
for (; b; b >>= 1, (a *= a) %= mod) if (b & 1) (res *= a) %= mod;
31+
return res;
32+
}
33+
signed main()
34+
{
35+
euler(100); g[1] = 1;
36+
scanf("%d%d",&n,&k);
37+
for(ll i=1;i<=n;++i)
38+
{
39+
if (pe[i] == i) g[i] = (qpow(p[i], 1LL * e[i] * k + 1) - 1 + mod) % mod * qpow(p[i] - 1, mod - 2) % mod;
40+
else g[i] = 1LL * g[i / pe[i]] * g[pe[i]] % mod;
41+
(ans += g[i]) %= mod;
42+
}
43+
return printf("%lld", ans) & 0;
44+
}

code/eratosthenes.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// C++ Version
2+
int is_prime[1000000], prime[300000];
3+
int Eratosthenes(int n)
4+
{
5+
int p = 0;
6+
for (int i = 0; i <= n; ++i)
7+
is_prime[i] = 1;
8+
is_prime[0] = is_prime[1] = 0;
9+
for (int i = 2; i <= n; ++i)
10+
{
11+
if (is_prime[i])
12+
{
13+
prime[p++] = i; // prime[p]是i,后置自增运算代表当前素数数量
14+
if ((long long)i * i <= n)
15+
for (int j = i * i; j <= n; j += i)
16+
// 因为从 2 到 i - 1 的倍数我们之前筛过了,这里直接从 i
17+
// 的倍数开始,提高了运行速度
18+
is_prime[j] = 0; // 是i的倍数的均不是素数
19+
}
20+
}
21+
return p;
22+
}

code/high_prec_sqrt.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import java.math.BigInteger;
2+
3+
public class high_prec_sqrt {// Main
4+
public static void main(String[] args) {
5+
System.out.println(isqrtNewton(new BigInteger("99999")));
6+
}
7+
8+
public static BigInteger isqrtNewton(BigInteger n) {
9+
BigInteger a = BigInteger.ONE.shiftLeft(n.bitLength() / 2);
10+
boolean p_dec = false;
11+
for (;;) {
12+
BigInteger b = n.divide(a).add(a).shiftRight(1);
13+
if (a.compareTo(b) == 0 || a.compareTo(b) < 0 && p_dec)
14+
break;
15+
p_dec = a.compareTo(b) > 0;
16+
a = b;
17+
}
18+
return a;
19+
}
20+
}

code/meissel_lehmer.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include<bits/stdc++.h>
2+
#define N 216000
3+
#define ll long long
4+
using namespace std;
5+
int mn[N],pri[N/10],fl[N];
6+
int tot,cnt,num,n;
7+
int f[20005][55];
8+
int inf=2e9;
9+
int dp(int x,int y){
10+
if (x<=20000&&y<=50) return f[x][y];
11+
if (x==0||y==0) return x;
12+
if (1ll*pri[y]*pri[y]>=x&&x<N) return max(0,mn[x]-y);
13+
return dp(x,y-1)-dp(x/pri[y],y-1);
14+
}
15+
void pre(){
16+
for (int i=2;i<N;i++){
17+
if (!fl[i]) pri[++tot]=i;
18+
for (int j=1;i*pri[j]<N&&j<=tot;j++){
19+
fl[i*pri[j]]=1;
20+
if (i%pri[j]==0) break;
21+
}
22+
}
23+
for (int i=1;i<N;i++)
24+
mn[i]=(cnt+=1-fl[i]);
25+
for (int i=1;i<=20000;i++) f[i][0]=i;
26+
for (int i=1;i<=20000;i++)
27+
for (int j=1;j<=50;j++)
28+
f[i][j]=f[i][j-1]-f[i/pri[j]][j-1];
29+
}
30+
int power(int x,int y){
31+
int s=1;
32+
while (y!=0){
33+
if (y&1){
34+
if (s>=inf/x) s=inf;
35+
else s=s*x;
36+
}
37+
y/=2;
38+
if (x>=inf/x) x=inf;
39+
else x=x*x;
40+
}
41+
return s;
42+
}
43+
int yroot(ll x,int y){
44+
int l=2,r=6666,ans=1;
45+
while (l<=r){
46+
int mid=(l+r)/2;
47+
if (power(mid,y)<=x) ans=mid,l=mid+1;
48+
else r=mid-1;
49+
}
50+
return ans;
51+
}
52+
int work(int m){
53+
if (m<N) return mn[m]-1;
54+
int y=yroot(m,3),n=mn[y];
55+
int ans=dp(m,n)+n-1;
56+
for (n++;pri[n]*pri[n]<=m;n++)
57+
ans-=mn[m/pri[n]]-mn[pri[n]]+1;
58+
return ans;
59+
}
60+
int main(){
61+
pre();
62+
scanf("%d",&n);
63+
int an=work(n);
64+
printf("%d\n",an);
65+
for(int i=1;i<=an;++i) printf("%d ",pri[i]);
66+
}

code/p1835_euler.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
#define MAXN 1000002
5+
#define SQRTR 50000
6+
ll prime[MAXN], k, ans, lf, rf, p, bg;
7+
bool vis[MAXN];
8+
inline void euler()
9+
{
10+
for(ll i = 2; i <= SQRTR; ++i)
11+
{
12+
if (!vis[i]) prime[++k] = i;
13+
for (ll j = 1; i * prime[j] <= SQRTR; ++j)
14+
{
15+
vis[i * prime[j]] = true;
16+
if (i % prime[j] == 0) break;
17+
}
18+
}
19+
}
20+
signed main()
21+
{
22+
scanf("%lld%lld", &lf, &rf);
23+
lf = (lf == 1) ? 2 : lf;
24+
euler();
25+
memset(vis,0,sizeof vis);
26+
for(ll i = 1; i <= k; ++i)
27+
{
28+
p = prime[i];
29+
bg = (lf + p - 1) / p * p > 2 * p ? (lf + p - 1) / p * p : 2 * p;
30+
for (ll j = bg; j <= rf; j += p) vis[j - lf + 1] = true;
31+
}
32+
for(ll i = 1; i <= rf - lf + 1; ++i) if (!vis[i]) ++ans;
33+
printf("%lld", ans);
34+
return 0;
35+
}

code/p1932_high_prec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import java.util.Scanner;
22
import java.math.BigInteger;
33

4-
public class Main {
4+
public class p1932_high_prec {// Main
55
public static void main(String[] args) {
66
Scanner sc = new Scanner(System.in);
77
BigInteger a = new BigInteger(sc.next());

code/p3383_euler.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <bits/stdc++.h>
2+
#define MAXN 100000002
3+
#define MAXP 6000002
4+
using namespace std;
5+
bool vis[MAXN]; //vis[0] = vis[1] = 1;
6+
int Prime[MAXP], k, n, q, c;
7+
void euler(int n)
8+
{
9+
for(int i=2;i<=n;i++)
10+
{
11+
if(!vis[i]) Prime[++k]=i;
12+
for(int j=1;j<=k;j++)
13+
{
14+
if(Prime[j]*i>n) break;
15+
vis[Prime[j]*i]=true;
16+
if(i%Prime[j]==0) break;
17+
}
18+
}
19+
}
20+
int main()
21+
{
22+
scanf("%d%d", &n, &q);
23+
euler(n);
24+
while(q--)
25+
{
26+
scanf("%d", &c);
27+
printf("%d\n", Prime[c]);
28+
}
29+
return 0;
30+
}

code/p3601_euler_function.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef long long ll;
4+
#define MAXN 1000002
5+
#define MOD 666623333
6+
ll l, r, ans, cnt, prime[MAXN], a[MAXN], b[MAXN];
7+
bool vis[MAXN];
8+
signed main()
9+
{
10+
for(ll i=2;i<=MAXN;++i)
11+
{
12+
if (!vis[i]) prime[++cnt] = i;
13+
for (ll j = i << 1; j <= MAXN; j += i) vis[j] = true;
14+
}
15+
scanf("%lld%lld", &l, &r);
16+
for(ll i=l;i<=r;++i) a[i - l] = b[i - l] = i;
17+
ll i = 1;
18+
while (prime[i] * prime[i] <= r)
19+
{
20+
ll p = prime[i];
21+
for (ll x = (p - l % p) % p; x + l <= r; x += p)
22+
{
23+
(a[x] /= p) *= p - 1;
24+
while (b[x] % p == 0) b[x] /= p;
25+
}
26+
++i;
27+
}
28+
for(ll i=0;i<=r-l;++i)
29+
{
30+
if (b[i] != 1) (a[i] /= b[i]) *= b[i] - 1;
31+
(ans += l + i - a[i]) %= MOD;
32+
}
33+
printf("%lld", ans);
34+
return 0;
35+
}

code/p3807_lucas.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
typedef double db;
4+
typedef long long ll;
5+
#define mn 100002
6+
ll a[mn], p, t, n, m;//i!=a[i]
7+
ll qpow(ll a, ll b)
8+
{
9+
ll res = 1;
10+
for (; b; b >>= 1, a = a * a % p) if (b & 1)
11+
res = res * a % p;
12+
return res;
13+
}
14+
ll C(ll n, ll m)
15+
{
16+
if (m > n) return 0;
17+
return ((a[n] * qpow(a[m], p - 2)) % p * qpow(a[n - m], p - 2) % p);
18+
}
19+
ll lucas(ll n, ll m)
20+
{
21+
if (!m) return 1;
22+
return C(n % p, m % p) * lucas(n / p, m / p) % p;
23+
}
24+
signed main()
25+
{
26+
a[0] = 1;
27+
for (scanf("%lld", &t); t; --t)
28+
{
29+
scanf("%lld%lld%lld", &n, &m, &p);
30+
for(ll i = 1; i <= p; ++i) a[i] = a[i - 1] * i % p;
31+
printf("%lld\n", lucas(n + m, n));//原题算C(m+n,n)
32+
}
33+
return 0;
34+
}

0 commit comments

Comments
 (0)