考前模板整理

写在前面

考前太焦虑了。。想8出题,就来写板子吧。去年列的目录找不到了,重新列了一个。感觉不是很全,代码一点点填吧

成功不必在我,而功力必不唐捐。 

算法

数位dp

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int a[12],f[12][10][2],cnt;//f[i][j][k]表示前i位,第i - 1位为j,是(1)否(0)有限制的方案数 
22 int dfs(int pos,int lst,int lim) {
23     if(pos == 0) return 1;
24     if(f[pos][lst][lim] != -1) return f[pos][lst][lim];    
25     int ret = 0;    
26     int k = 9;
27     if(lim) k = a[pos];    
28     for(int i = 0;i <= k;++i) {
29         if(i == 4 || (lst == 6 && i == 2)) continue;
30         ret += dfs(pos - 1,i,lim && (i == k));
31     }
32     return f[pos][lst][lim] = ret;
33     
34 }
35 int solve(int x) {
36     memset(f,-1,sizeof(f));
37     cnt = 0;
38     while(x) {
39         a[++cnt] = x % 10;
40         x /= 10;
41     }
42     return dfs(cnt,0,1);
43 }
44 int main() {
45     while(1) {
46         int l = read(),r = read();
47         if(!l && !r) return 0;
48         printf("%d\n",solve(r) - solve(l - 1));
49     }
50     return 0;
51 }
hdu2089
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
using namespace std;
typedef long long ll;
const int mod = 1000000007;
ll read() {
    ll x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0';c = getchar();
    }
    return x * f;
}
char s[110];
int a[110],f[110][10][2][2][2];//f[i][j][0/1][0/1][0/1]表示前i位第i-1位填的是j,是否有限制,是否在递增,是否为前导0 
int dfs(int pos,int lst,int flag,int lim,int rea) {
    if(!pos) return rea;
    if(f[pos][lst][flag][lim][rea] != -1) return f[pos][lst][flag][lim][rea];
    int l = 0,r = 9;
    if(lim) r = a[pos];
    if(flag) l = lst;
    int ret = 0;
    for(int i = l;i <= r;++i) {
        ret += dfs(pos - 1,i,flag || (i > lst && rea),lim && (i == r),((!rea) && (!i)) ^ 1);
        ret %= mod;
    }
    return f[pos][lst][flag][lim][rea] = ret;
}

int main() {
    int T = read();
    while(T--) {
        memset(f,-1,sizeof(f));
        scanf("%s",s + 1);
        int n = strlen(s + 1);
        for(int i = 1;i <= n;++i) a[n - i + 1] = s[i] - '0';
        cout<<dfs(n,0,0,1,0)<<endl;
    }
    return 0;
}
hdu6148

矩阵乘法

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int mod = 1e9 + 7;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 
22 struct node {
23     int a[10][10],n,m;
24     node() {
25         memset(a,0,sizeof(a));n = m = 0;
26     }
27     node(int x) {
28         n = m = x;
29         memset(a,0,sizeof(a)); for(int i = 1;i <= n;++i) a[i][i] = 1;
30     }
31     node(int x,int y) {
32         n = x,m = y; memset(a,0,sizeof(a));
33     }
34 };
35 
36 node operator * (const node &A,const node &B) {
37     int n = A.n,m = B.m,K = A.m;
38     node C(n,m);
39     for(int k = 1;k <= K;++k)
40         for(int i = 1;i <= n;++i)
41             for(int j = 1;j <= m;++j)
42                 C.a[i][j] += 1ll * A.a[i][k] * B.a[k][j] % mod,C.a[i][j] %= mod;
43 
44     return C;
45 }
46 node operator ^ (node A,int y) {
47     node ret(A.n);
48     for(;y;y >>= 1,A = A * A)
49         if(y & 1) ret =ret * A;
50     return ret;
51 }
52 
53 int main() {
54     int T = read();
55     node A(1,3);
56     A.a[1][1] = A.a[1][2] = A.a[1][3] = 1;
57 
58     node C(3,3);
59     C.a[1][1] = C.a[1][2] = C.a[2][3] = C.a[3][1] = 1;
60     
61     while(T--) {
62         int n = read();
63         if(n <= 3) {puts("1");continue;}
64         printf("%d\n",(A * (C ^ (n - 3))).a[1][1]);
65         
66     }
67     return 0;
68 }
luogu1939

manacher

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 31000000;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int f[N],id,mx;
22 char s[N],t[N];
23 int main() {
24     scanf("%s",t + 1);
25     int n = strlen(t + 1);
26     int m = 0;
27     s[++m] = '#';
28     for(int i = 1;i <= n;++i) {
29         s[++m] = t[i];
30         s[++m] = '#';
31     }
32     n = m;
33     int ans = 0;
34     for(int i = 1;i <= n;++i) {
35         
36         if(i <= id + mx) f[i] = min(f[id * 2 - i],id + mx - i);
37         while(i - f[i] - 1 >= 1 && i + f[i] + 1 <= n && s[i + f[i] + 1] == s[i - f[i] - 1]) ++f[i];
38         if(i + f[i] > id + mx) {
39             id = i;mx = f[i];
40         }
41         ans = max(ans,f[i]);
42     }
43     cout<<ans;
44     
45     return 0;
46 }
luogu3805

kmp

 1 //n-nxt[n]为最小循环节的长度 
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<queue>
 8 #include<set>
 9 using namespace std;
10 typedef long long ll;
11 const int N = 2000100;
12 ll read() {
13     ll x = 0,f = 1;char c = getchar();
14     while(c < '0' || c > '9') {
15         if(c == '-') f = -1;c = getchar();
16     }
17     while(c >= '0' && c <= '9') {
18         x = x * 10 + c - '0';c = getchar();
19     }
20     return x * f;
21 }
22 int n,m,nxt[N];
23 char s[N],t[N];
24 void get_nxt() {
25     
26     int p = 0;
27     for(int i = 2;i <= m;++i) {
28         while(p && t[i] != t[p + 1]) p = nxt[p];
29         if(t[i] == t[p + 1]) ++p;
30         nxt[i] = p;
31     }
32     
33 }
34 int main() {
35     scanf("%s",s + 1);
36     scanf("%s",t + 1);
37     n = strlen(s + 1);
38     m = strlen(t + 1);
39     
40     get_nxt();
41     
42     int p = 0;
43     for(int i = 1;i <= n;++i) {
44         while(p && s[i] != t[p + 1]) p = nxt[p];
45         if(s[i] == t[p + 1]) {
46             ++p;
47             if(p == m) {
48                 printf("%d\n",i - m + 1);
49                 p = nxt[p];
50             }
51         }
52     }
53     for(int i = 1;i <= m;++i) printf("%d ",nxt[i]);
54     return 0;
55 }
luogu3375

AC自动机

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 2000100;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int trie[N][26],tot,ans[N],bz[N];
22 void ins(char *s,int pos) {//插入字符串 
23     int now = 0,len = strlen(s + 1);
24     for(int i = 1;i <= len;++i) {
25         int k = s[i] - 'a';
26         if(!trie[now][k]) trie[now][k] = ++tot;
27         now = trie[now][k];
28     }    
29     bz[pos] = now;
30 }
31 queue<int>q;
32 vector<int>e[N];
33 int fail[N];
34 void pre() { //构造trie图 
35     for(int i = 0;i < 26;++i) if(trie[0][i]) q.push(trie[0][i]);
36     while(!q.empty()) {
37         int u = q.front();q.pop();
38         
39         for(int i = 0;i < 26;++i) {
40             if(!trie[u][i]) trie[u][i] = trie[fail[u]][i];
41             else fail[trie[u][i]] = trie[fail[u]][i],q.push(trie[u][i]);
42         }
43     }
44     
45     for(int i = 1;i <= tot;++i) e[fail[i]].push_back(i);//构建fail树 
46 
47 }
48 char s[N];
49 void solve() {
50     int len = strlen(s + 1);
51     int now = 0;
52     for(int i = 1;i <= len;++i) {
53         now = trie[now][s[i] - 'a'];
54         ans[now]++;
55     }
56 }
57 void dfs(int u) {
58     for(vector<int>::iterator it = e[u].begin();it != e[u].end();++it) {
59         dfs(*it);
60         ans[u] += ans[*it];//某个节点在母串中出现的次数是fail树上其子树答案之和。 
61     }
62 }
63 int main() {
64     int T = read();
65     for(int i = 1;i <= T;++i) {
66         scanf("%s",s + 1);
67         ins(s,i);
68     }
69     pre();
70     scanf("%s",s + 1);
71     solve();
72     dfs(0);
73     
74     for(int i = 1;i <= T;++i) printf("%d\n",ans[bz[i]]);
75 
76     return 0;
77 }
luogu5357

线性基

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 110;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 ll p[N];
22 void ins(ll x) {
23     for(int i = 50;i >= 0;--i) {
24         if(!((x >> i) & 1)) continue;
25         if(!p[i]) {p[i] = x;break;}
26         else x ^= p[i];
27     }
28 }
29 int main() {
30     int n = read();
31     for(int i = 1;i <= n;++i) {
32         ll x = read();
33         ins(x);
34     }
35     ll ans = 0;
36     for(int i = 50;i >= 0;--i)
37         if((ans ^ p[i]) > ans) ans ^= p[i];
38     cout<<ans;
39     return 0;
40 }
luogu3812

meet in the middle

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<unordered_map>
 6 #include<vector>
 7 #include<queue>
 8 #include<set>
 9 using namespace std;
10 typedef long long ll;
11 
12 ll read() {
13     ll x = 0,f = 1;char c = getchar();
14     while(c < '0' || c > '9') {
15         if(c == '-') f = -1;c = getchar();
16     }
17     while(c >= '0' && c <= '9') {
18         x = x * 10 + c - '0';c = getchar();
19     }
20     return x * f;
21 }
22 unordered_map<ll,ll>ma[30];
23 ll a[30],n,K,S,jc[30];
24 void dfs1(int pos,ll now,int k) {
25     if(pos == n / 2 + 1) {
26         ma[k][now]++;return;
27     }
28     
29     dfs1(pos + 1,now,k);
30     dfs1(pos + 1,now + a[pos],k);
31     if(a[pos] <= 19 && jc[a[pos]] <= S && k + 1 <= K) dfs1(pos + 1,now + jc[a[pos]],k + 1);
32 }
33 ll ans;
34 void dfs2(int pos,ll now,int k) {
35     if(pos == n / 2) {
36         for(int j = 0;j + k <= K;++j) ans += ma[j][S - now];
37         return;
38     }
39     dfs2(pos - 1,now,k);
40     dfs2(pos - 1,now + a[pos],k);
41     if(a[pos] <= 19 && jc[a[pos]] <= S && k + 1 <= K) dfs2(pos - 1,now + jc[a[pos]],k + 1);
42     
43 }
44 int main() {
45     n = read(),K = read(),S = read();
46     for(int i = 1;i <= n;++i) a[i] = read();
47     jc[0] = 1;
48     for(int i = 1;i <= 19;++i) jc[i] = jc[i - 1] * i;
49     
50     dfs1(1,0,0);
51     dfs2(n,0,0);
52     cout<<ans;
53     return 0;
54 }
CF525E

tarjan

点双

边双

割点

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 200100;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int dfn[N],low[N],tot;
22 struct node {
23     int v,nxt;
24 }e[N << 1];
25 int head[N],ejs;
26 void add(int u,int v) {
27     e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
28 }
29 int du,ans[N],root;
30 void tarjan(int u,int fa) {
31     if(!dfn[u]) dfn[u] = low[u] = ++tot;
32     for(int i = head[u];i;i = e[i].nxt) {
33         int v = e[i].v;
34         if(v == fa) continue;
35         if(!dfn[v]) {
36             tarjan(v,u);
37             low[u] = min(low[u],low[v]);
38             if(u == root) du++;
39             if(low[v] >= dfn[u] && u != root) ans[u] = 1;
40         }
41         else low[u] = min(low[u],low[v]);
42     }
43     if(du >= 2 && u == root) ans[u] = 1;
44 }
45 
46 int main() {
47     int n = read(),m = read();
48     for(int i = 1;i <= m;++i) {
49         int u = read(),v = read();
50         add(u,v);add(v,u);
51     }
52     
53     for(int i = 1;i <= n;++i) {
54         if(!dfn[i]) {
55             root = i;
56             du = 0;
57             tarjan(i,0);
58         }
59     }
60     int cnt = 0;
61     for(int i = 1;i <= n;++i) cnt += ans[i];
62     printf("%d\n",cnt);
63     for(int i = 1;i <= n;++i) if(ans[i]) printf("%d ",i);
64 
65     return 0;
66 }
luogu3388

强连通分量

莫队

朴素莫队

带修莫队

树上莫队

分数规划

匈牙利

差分约束

分层图

欧拉回路

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 100100;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int rc() {
22     char c = getchar();
23     while(c < 'A' || c > 'z') c = getchar();
24     if(c > 'Z') c -= 6;
25     return c - 'A';
26 }
27 int n,a[100][100],du[100],ans[N],cnt;
28 void dfs(int u) {
29     for(int i = 0;i < 52;++i)
30         if(a[u][i]) a[u][i]--,a[i][u]--,dfs(i);
31     ans[++cnt] = u;
32 }
33 
34 int main() {
35     n = read();
36     int rt = 52;
37     for(int i = 1;i <= n;++i) {
38         int u = rc(),v = rc();
39         if(!a[u][v]) {
40             a[u][v]++;
41             a[v][u]++;
42             du[u]++;du[v]++;
43             
44         }
45     }
46 
47     int js = 0;
48     for(int i = 0;i < 52;++i)
49         if(du[i] & 1) js++;
50 
51     if(js == 0) {
52         for(int i = 0;i < 52;++i) if(du[i]) rt = min(rt,i);
53     }
54     else if(js == 2) {
55         for(int i = 0;i < 52;++i) if(du[i] & 1) rt = min(rt,i);
56     }
57     else {puts("No Solution");return 0;}
58     
59     dfs(rt);
60     
61     for(int i = cnt;i >= 1;--i) putchar(ans[i] + 'A' > 'Z' ? ans[i] + 'A' + 6 : ans[i] + 'A');
62     
63     return 0;
64 }
luogu1341

数学

高斯消元

线性筛

线性筛素数

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 10000010;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int dis[N],vis[N],cnt;
22 int main() {
23     int n = read(),m = read();
24     vis[1] = 1;
25     for(int i = 2;i <= n;++i) {
26         if(!vis[i]) dis[++cnt] = i; 
27         for(int j = 1;j <= cnt && dis[j] * i <= n;++j) {
28             vis[dis[j] * i] = 1;
29             if(i % dis[j] == 0) break;
30         }
31     }
32     while(m--) puts(vis[read()] ? "No" : "Yes");
33     return 0;
34 }
luogu3383

线性筛欧拉函数

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<ctime>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 10000100;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int vis[N],pri[N],phi[N],cnt;
22 int main() {
23     int n = read();
24     phi[1] = 1;
25     for(int i = 2;i <= n;++i) {
26         if(!vis[i]) {
27             phi[i] = i - 1;
28             pri[++cnt] = i;
29         }
30         for(int j = 1;j <= cnt && pri[j] * i <= n;++j) {
31             vis[pri[j] * i] = 1;
32             if(i % pri[j] == 0) {
33                 phi[pri[j] * i] = pri[j] * phi[i];break;
34             }
35             phi[pri[j] * i] = (pri[j] - 1) * phi[i];
36         }
37         printf("phi(%d) = %d\n",i,phi[i]);
38     }
39     return 0;
40 }
线性筛欧拉函数

欧拉函数

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int phi(int x) {
22     int ret = 1;
23     for(int i = 2;i * i <= x;++i) {
24         if(x % i == 0) {
25             ret *= i - 1;
26             x /= i;
27         }
28         while(x % i == 0) {
29             ret *= i;
30             x /= i;
31         }
32     }
33     if(x != 1) ret *= x - 1;
34     return ret;
35 }
36 ll mod,a;
37 ll qm(ll x,ll y) {
38     ll ret = 1;
39     for(;y;y >>= 1,x = x * x % mod)
40     if(y & 1) ret = ret * x % mod;
41     return ret;
42 }
43 int main() {
44     a = read(),mod = read();
45     cout<<qm(a,phi(mod) - 1);
46     return 0;
47 }
luogu1082

欧拉降幂

扩展欧几里得

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 ll exgcd(ll a,ll b,ll &x,ll &y) {
22     if(!b) {
23         x = 1,y = 0;
24         return a;
25     }
26     ll ret = exgcd(b,a % b,y,x);
27     y -= a / b * x;
28     return ret;
29 }
30 int main() {
31     ll x = read(),y = read(),m = read(),n = read(),L = read();
32     ll A = L,B = n - m,C = x - y;
33     if(B < 0) B = -B,C = -C;
34     ll X,Y;
35     int k = exgcd(A,B,X,Y);
36     if(C % k != 0) return puts("Impossible"),0;
37     int t = L / k;
38     cout<<(C / k * Y % t + t) % t;
39     return 0;
40 }
luogu1516

卢卡斯

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 200100;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int jc[N],inv[N],mod;
22 ll qm(ll x,ll y) {
23     ll ret = 1;
24     for(;y;y >>= 1,x = x * x % mod)
25     if(y & 1) ret = ret * x % mod;
26     return ret;
27 }
28 ll C(ll n,ll m) {
29     
30     if(n < m) return 0;
31     
32     if(n < mod && m < mod) 
33     return 1ll * jc[n] * inv[m] % mod * inv[n - m] % mod;
34     
35     return C(n / mod,m / mod) * C(n % mod,m % mod) % mod;
36     
37 }
38 int main() {
39     int T = read();
40     while(T--) {
41         int n = read(),m = read();mod = read();
42         n += m;
43         jc[0] = 1;
44         
45         for(int i = 1;i < mod;++i) 
46         jc[i] = 1ll * jc[i - 1] * i % mod;
47         
48         inv[mod - 1] = qm(jc[mod - 1],mod - 2);
49         
50         for(int i = mod - 2;i >= 0;--i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
51         cout<<C(n,m)<<endl;
52         
53     }
54     return 0;
55 }
luogu3807

线性求逆元

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 int inv[3000001];
22 int main() {
23     int n = read(),mod = read();
24     
25     inv[1] = 1;
26     puts("1");
27     for(int i = 2;i <= n;++i) {
28         inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
29         printf("%d\n",inv[i]);
30     }
31      
32     return 0;
33 }
luogu3811

数据结构

st表

 1 /*
 2 * @Author: wxyww
 3 * @Date: 2019-11-16 16:48:36
 4 * @Last Modified time: 2019-11-16 16:54:26
 5 */
 6 #include<cstdio>
 7 #include<iostream>
 8 #include<cstdlib>
 9 #include<cmath>
10 #include<ctime>
11 #include<bitset>
12 #include<cstring>
13 #include<algorithm>
14 #include<string>
15 #include<queue>
16 #include<vector>
17 using namespace std;
18 typedef long long ll;
19 const int N = 1000100,logN = 20;
20 ll read() {
21     ll x=0,f=1;char c=getchar();
22     while(c<'0'||c>'9') {
23         if(c=='-') f=-1;
24         c=getchar();
25     }
26     while(c>='0'&&c<='9') {
27         x=x*10+c-'0';
28         c=getchar();
29     }
30     return x*f;
31 }
32 int a[N],st[N][logN + 1],cf[N],lg[N];
33 int query(int l,int r) {
34     int len = r - l + 1;
35     return max(st[l][lg[len]],st[r - cf[lg[len]] + 1][lg[len]]); 
36 }
37 int main() {
38     int n = read(),m = read();
39     for(int i = 2;i <= n;++i) lg[i] = lg[i >> 1] + 1;
40     cf[0] = 1;
41     for(int i = 1;i <= logN;++i) cf[i] = cf[i - 1] << 1;
42 
43     for(int i = 1;i <= n;++i) st[i][0] = read();
44 
45     for(int j = 1;j <= lg[n];++j) {
46         for(int i = 1;i <= n;++i) {
47             st[i][j] = max(st[i][j - 1],st[i + cf[j - 1]][j - 1]);
48         }
49     }
50     while(m--) {
51         int l = read(),r = read();
52         printf("%d\n",query(l,r));
53     }
54     return 0;
55 }
luogu3865

lca

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<queue>
 7 #include<set>
 8 using namespace std;
 9 typedef long long ll;
10 const int N = 500010,logN = 22;
11 ll read() {
12     ll x = 0,f = 1;char c = getchar();
13     while(c < '0' || c > '9') {
14         if(c == '-') f = -1;c = getchar();
15     }
16     while(c >= '0' && c <= '9') {
17         x = x * 10 + c - '0';c = getchar();
18     }
19     return x * f;
20 }
21 struct node {
22     int v,nxt;
23 }e[N << 1];
24 int head[N],ejs;
25 void add(int u,int v) {
26     e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs; 
27 }
28 int n,m,S,lca[N][logN + 1],dep[N];
29 void dfs(int u,int fa) {
30     dep[u] = dep[fa] + 1;
31     for(int i = 1;i <= logN;++i)
32         lca[u][i] = lca[lca[u][i - 1]][i - 1];
33     for(int i = head[u];i;i = e[i].nxt) {
34         int v = e[i].v;
35         if(v == fa) continue;
36         lca[v][0] = u;
37         dfs(v,u);
38     }
39 }
40 
41 int LCA(int x,int y) {
42     if(dep[x] < dep[y]) swap(x,y);
43     for(int i = logN;i >= 0;--i)
44         if(dep[lca[x][i]] >= dep[y]) x = lca[x][i];
45     for(int i = logN;i >= 0;--i)
46         if(lca[x][i] != lca[y][i]) x = lca[x][i],y = lca[y][i];
47     if(x != y) return lca[x][0];
48     return x;
49 }
50 int main() {
51     n = read(),m = read(),S = read();
52     for(int i = 1;i < n;++i) {
53         int u = read(),v = read();
54         add(u,v);add(v,u);
55     }
56     
57     dfs(S,0);
58     
59     while(m--) {
60         int x = read(),y = read();
61         printf("%d\n",LCA(x,y));
62     }
63     
64     return 0;
65 }
luogu3379

树剖

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<queue>
  7 #include<set>
  8 using namespace std;
  9 typedef long long ll;
 10 const int N = 200100;
 11 ll read() {
 12     ll x = 0,f = 1;char c = getchar();
 13     while(c < '0' || c > '9') {
 14         if(c == '-') f = -1;c = getchar();
 15     }
 16     while(c >= '0' && c <= '9') {
 17         x = x * 10 + c - '0';c = getchar();
 18     }
 19     return x * f;
 20 }
 21 
 22 struct node {
 23     int v,nxt;
 24 }e[N << 1];
 25 int head[N],ejs;
 26 void add(int u,int v) {
 27     e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
 28 }
 29 int son[N],dep[N],top[N],fa[N],siz[N],id[N],w[N],ww[N];
 30 int tree[N << 2],lazy[N << 2],mod;
 31 void build(int rt,int l,int r) {
 32     if(l == r) {
 33         tree[rt] = w[l];return;
 34     }
 35     int mid = (l + r) >> 1;
 36     build(rt << 1,l,mid);
 37     build(rt << 1 | 1,mid + 1,r);
 38     tree[rt] = (tree[rt << 1] + tree[rt << 1 | 1]) % mod;
 39 }
 40 void pushdown(int rt,int ln,int rn) {
 41     if(lazy[rt]) {
 42         int k = lazy[rt];
 43         tree[rt << 1] += 1ll * k * ln % mod;tree[rt << 1] %= mod;
 44         tree[rt << 1 | 1] += 1ll * k * rn % mod;tree[rt << 1 | 1] %= mod;
 45         lazy[rt << 1] += k;lazy[rt << 1] %= mod;
 46         lazy[rt << 1 | 1] += k;lazy[rt << 1 | 1] %= mod;
 47         lazy[rt] = 0;
 48     }
 49 }
 50 void update(int rt,int l,int r,int L,int R,int c) {
 51     if(L <= l && R >= r) {
 52         lazy[rt] += c;
 53         tree[rt] += 1ll * c * (r - l + 1) % mod;
 54         return;
 55     }
 56     int mid = (l + r) >> 1;
 57     pushdown(rt,mid - l + 1,r - mid);
 58     if(L <= mid) update(rt << 1,l,mid,L,R,c);
 59     if(R > mid) update(rt << 1 | 1,mid + 1,r,L,R,c);
 60     tree[rt] = (tree[rt << 1] + tree[rt << 1 | 1]) % mod;
 61 }
 62 int query(int rt,int l,int r,int L,int R) {
 63     if(L <= l && R >= r) return tree[rt];
 64     int mid = (l + r) >> 1;
 65     pushdown(rt,mid - l + 1,r - mid);
 66     ll ret = 0;
 67     if(L <= mid) ret += query(rt << 1,l,mid,L,R),ret %= mod;
 68     if(R > mid) ret += query(rt << 1 | 1,mid + 1,r,L,R),ret %= mod;
 69     return ret;
 70 }
 71 
 72 
 73 void dfs1(int u,int father) {
 74     dep[u] = dep[father] + 1;
 75     siz[u] = 1;
 76     fa[u] = father;
 77     for(int i = head[u];i;i = e[i].nxt) {
 78         int v = e[i].v;
 79         if(v == father) continue;
 80         dfs1(v,u);
 81         siz[u] += siz[v];
 82         if(siz[v] > siz[son[u]]) son[u] = v;
 83     }
 84 }
 85 int tot;
 86 void dfs2(int u,int father,int ttop) {
 87     id[u] = ++tot;
 88     w[id[u]] = ww[u];
 89     top[u] = ttop;
 90     if(!son[u]) return;
 91     dfs2(son[u],u,ttop);
 92     for(int i = head[u];i;i = e[i].nxt) {
 93         int v = e[i].v;
 94         if(v == father || v == son[u]) continue;
 95         dfs2(v,u,v);
 96     }
 97 }
 98 int n,m,root;
 99 void LCA(int x,int y,int c) {
100     int fx = top[x],fy = top[y];
101     while(fx != fy) {
102         if(dep[fx] > dep[fy]) {
103             update(1,1,n,id[fx],id[x],c);
104             x = fa[fx]; fx = top[x];
105         }
106         else {
107             update(1,1,n,id[fy],id[y],c);
108             y = fa[fy]; fy = top[y];
109         }
110     }
111     if(dep[x] > dep[y]) swap(x,y);
112     update(1,1,n,id[x],id[y],c);
113 }
114 int LCA(int x,int y) {
115     int fx = top[x],fy = top[y];ll ret = 0;
116     while(fx != fy) {
117         if(dep[fx] > dep[fy]) {
118             ret += query(1,1,n,id[fx],id[x]);
119             ret %= mod;
120             x = fa[fx];
121             fx = top[x];
122         }
123         else {
124             ret += query(1,1,n,id[fy],id[y]);
125             ret %= mod;
126             y = fa[fy];
127             fy = top[y];
128         }
129     }
130     if(dep[x] > dep[y]) swap(x,y);
131     ret += query(1,1,n,id[x],id[y]);
132     return ret % mod;
133 }
134 int main() {
135     n = read(),m = read(),root = read();mod = read();
136     for(int i = 1;i <= n;++i) ww[i] = read();
137     for(int i = 1;i < n;++i) {
138         int u = read(),v = read();
139         add(u,v);add(v,u);
140     }
141     dfs1(root,0);
142     dfs2(root,0,root);
143     build(1,1,n);
144     while(m--) {
145         int opt = read();
146         if(opt == 1) {
147             int x = read(),y = read(),z = read();
148             LCA(x,y,z);
149         }
150         else if(opt == 2) {
151             int x = read(),y = read();
152             printf("%d\n",LCA(x,y));
153         }
154         else if(opt == 3) {
155             int x = read(),y = read();
156             update(1,1,n,id[x],id[x] + siz[x] - 1,y);
157         }
158         else {
159             int x = read();
160             printf("%d\n",query(1,1,n,id[x],id[x] + siz[x] - 1));
161         }
162     }    
163     return 0;
164 }
luogu3384

set

线段树

  1 /*
  2 * @Author: wxyww
  3 * @Date: 2019-11-15 15:25:47
  4 * @Last Modified time: 2019-11-15 15:49:54
  5 */
  6 #include<cstdio>
  7 #include<iostream>
  8 #include<cstdlib>
  9 #include<cmath>
 10 #include<ctime>
 11 #include<bitset>
 12 #include<cstring>
 13 #include<algorithm>
 14 #include<string>
 15 #include<queue>
 16 #include<vector>
 17 using namespace std;
 18 typedef long long ll;
 19 const int N = 200100;
 20 ll read() {
 21     ll x=0,f=1;char c=getchar();
 22     while(c<'0'||c>'9') {
 23         if(c=='-') f=-1;
 24         c=getchar();
 25     }
 26     while(c>='0'&&c<='9') {
 27         x=x*10+c-'0';
 28         c=getchar();
 29     }
 30     return x*f;
 31 }
 32 ll a[N],tree[N << 1],mod,lazy1[N << 2],lazy2[N << 2];//lazy1存乘,lazy2存加
 33 
 34 void pushup(int rt) {
 35     tree[rt] = (tree[rt << 1] + tree[rt << 1 | 1]) % mod;
 36 }
 37 
 38 void pushdown(int rt,int ln,int rn) {
 39     if(lazy1[rt] != 1) {
 40         lazy2[rt << 1] = lazy2[rt << 1] * lazy1[rt] % mod;
 41         lazy2[rt << 1 | 1] = lazy2[rt << 1 | 1] * lazy1[rt] % mod;
 42 
 43         lazy1[rt << 1] = lazy1[rt << 1] * lazy1[rt] % mod;
 44         lazy1[rt << 1 | 1] = lazy1[rt << 1 | 1] * lazy1[rt] % mod;
 45 
 46         tree[rt << 1] = tree[rt << 1] * lazy1[rt] % mod;
 47         tree[rt << 1 | 1] = tree[rt << 1 | 1] * lazy1[rt] % mod;
 48         lazy1[rt] = 1;
 49     }
 50     if(lazy2[rt]) {
 51         lazy2[rt << 1] += lazy2[rt];lazy2[rt << 1] % mod;
 52         lazy2[rt << 1 | 1] += lazy2[rt];lazy2[rt << 1 | 1] %= mod;
 53         tree[rt << 1] += lazy2[rt] * ln % mod;tree[rt << 1] %= mod;
 54         tree[rt << 1 | 1] += lazy2[rt] * rn % mod;tree[rt << 1 | 1] %= mod;
 55         lazy2[rt] = 0;
 56     }
 57 }
 58 
 59 void build(int rt,int l,int r) {
 60     lazy1[rt] = 1;
 61     if(l == r) {
 62         tree[rt] = a[l];return;
 63     }
 64     int mid = (l + r) >> 1;
 65     build(rt << 1,l,mid);
 66     build(rt << 1 | 1,mid + 1,r);
 67     pushup(rt);
 68 }
 69 
 70 void update1(int rt,int l,int r,int L,int R,int c) {
 71     if(L <= l && R >= r) {
 72         tree[rt] = tree[rt] * c % mod;
 73         lazy1[rt] = lazy1[rt] * c % mod;
 74         lazy2[rt] = lazy2[rt] * c % mod;
 75         return;
 76     }
 77     int mid = (l + r) >> 1;
 78     pushdown(rt,mid - l + 1,r - mid);
 79     if(L <= mid) update1(rt << 1,l,mid,L,R,c);
 80     if(R > mid) update1(rt << 1 | 1,mid + 1,r,L,R,c);
 81     pushup(rt);
 82 }
 83 void update2(int rt,int l,int r,int L,int R,int c) {
 84     if(L <= l && R >= r) {
 85         tree[rt] += 1ll * (r - l + 1) * c % mod;tree[rt] %= mod;
 86         lazy2[rt] += c;lazy2[rt] %= mod;
 87         return;
 88     }
 89     int mid = (l + r) >> 1;
 90     pushdown(rt,mid - l + 1,r - mid);
 91     if(L <= mid) update2(rt << 1,l,mid,L,R,c);
 92     if(R > mid) update2(rt << 1 | 1,mid + 1,r,L,R,c);
 93     pushup(rt);
 94 }
 95 int query(int rt,int l,int r,int L,int R) {
 96     if(L <= l && R >= r) return tree[rt];
 97     int mid = (l + r) >> 1;
 98     pushdown(rt,mid - l + 1,r - mid);
 99     int ret = 0;
100     if(L <= mid) ret += query(rt << 1,l,mid,L,R),ret %= mod;
101     if(R > mid) ret += query(rt << 1 | 1,mid + 1,r,L,R),ret %= mod;
102     return ret;
103 }
104 int main() {
105     int n = read(),m = read();mod = read();
106     for(int i = 1;i <= n;++i) a[i] = read();
107     build(1,1,n);
108     while(m--) {
109         int opt = read();
110         if(opt == 1) {
111             int x = read(),y = read(),c = read();
112             update1(1,1,n,x,y,c);
113         }
114         else if(opt == 2) {
115             int x = read(),y = read(),c = read();
116             update2(1,1,n,x,y,c);
117         }
118         else {
119             int x = read(),y = read();
120             printf("%d\n",query(1,1,n,x,y));
121         }
122     }
123     return 0;
124 }
luogu3373

其他

bat批量重命名文件

数据生成器

bat对拍

lemon下的SPJ

posted @ 2019-11-11 19:10  wxyww  阅读(528)  评论(10编辑  收藏  举报