欧拉函数
1 #include <iostream> 2 3 using namespace std; 4 5 int phi(int x){ 6 int ans = x; 7 for(int i = 2; i*i <= x; i++){ 8 if(x%i == 0){ 9 ans = ans - ans/i; 10 while(x%i == 0) 11 x /= i; 12 } 13 } 14 if(x > 1) 15 ans = ans - ans/x; 16 return ans; 17 } 18 19 int n; 20 int main(){ 21 cin >> n; 22 cout << phi(n) << endl; 23 return 0; 24 }
矩阵快速幂
1 #include <iostream> 2 #define mod 1000000000 3 #define N 100 4 #define ll long long int 5 using namespace std; 6 struct Node{ 7 int vis[N][N]; 8 }node; 9 10 Node mul(Node a, Node b){ 11 Node c; 12 for(int i = 0; i < 2; i++){ 13 for(int k = 0; k < 2; k++){ 14 for(int j = 0; j < 2; j++){ 15 c.vis[i][j] = (c.vis[i][j] + a.vis[i][k]*b.vis[k][j])%mod; 16 } 17 } 18 } 19 return c; 20 } 21 22 Node quick_pow(Node a, ll b){ 23 Node c; 24 for(int i = 0; i < 2; i++) 25 c.vis[i][i] = 1; 26 while(b){ 27 if(b&1) 28 c = mul(a, c); 29 a = mul(a, a); 30 b >>= 1; 31 } 32 return c; 33 } 34 35 36 37 int main(){ 38 Node ans; 39 ans.vis[0][0] = 1; ans.vis[0][1] = 1; 40 ans.vis[1][0] = 1; ans.vis[1][1] = 0; 41 Node cnt = quick_pow(ans, 20); 42 for(int i = 0; i < 2; i++){ 43 for(int j = 0 ; j < 2; j++){ 44 cout << cnt.vis[i][j] << " "; 45 } 46 cout << endl; 47 } 48 cout << endl; 49 return 0; 50 }
快速幂
1 #include <iostream> 2 #define mod 1000000000 3 #define N 100000 4 #define ll long long int 5 using namespace std; 6 7 ll quick_pow(ll a, ll b){ 8 ll ans = 1; 9 while(b){ 10 if(b&1) 11 ans = (ans*a)%mod; 12 a = (a*a)%mod; 13 b >>= 1; 14 } 15 return ans; 16 } 17 18 int main(){ 19 ll n, m; 20 cin >> n >> m; 21 cout << quick_pow(n,m)<<endl; 22 return 0; 23 }
kmp
1 #include <bits/stdc++.h> 2 #define N 100000 3 using namespace std; 4 int Next[N]; 5 6 void getNext(string s){ 7 int j = -1; 8 int i = 0; 9 int len = s.length(); 10 Next[0] =-1; 11 while(i < len){ 12 if(j == -1 || s[i] == s[j]){ 13 i++; 14 j++; 15 Next[i] = j; 16 }else 17 j = Next[j]; 18 } 19 } 20 21 int kmp(string s, string ss){ 22 getNext(ss); 23 int i = 0, j = 0; 24 int slen = s.length(); 25 int sslen = ss.length(); 26 while( i < slen && j < sslen){ 27 if(j == -1 || s[i] == ss[j]){ 28 i ++; j++; 29 }else 30 j = Next[j]; 31 } 32 if(j == sslen){ 33 return i - j + 1; 34 } 35 return -1; 36 } 37 38 string s, ss; 39 int main(){ 40 cin >> s >> ss; 41 int an = kmp(s, ss); 42 if(an == -1){ 43 cout << "NO" << endl; 44 }else{ 45 cout << "YES" <<" " << an << endl; 46 } 47 return 0; 48 }
树状数组
1 #include <bits/stdc++.h> 2 #define N 50005 3 #define mem(a) memset(a,0,sizeof(a)) 4 using namespace std; 5 struct Node{ 6 int a,b; 7 }node[N]; 8 int tree[N]; 9 bool cmp(Node x,Node y){ 10 return x.a>y.a; 11 } 12 int lowbit(int x){ return x&(-x);} 13 14 int update(int x){ 15 while(x<N){ 16 tree[x]++; 17 x+=lowbit(x); 18 } 19 } 20 int sum(int x){ 21 int sum=0; 22 while(x){ 23 sum+=tree[x]; 24 x-=lowbit(x); 25 } 26 return sum; 27 } 28 int main() { 29 int n; 30 cin>>n; 31 mem(tree); 32 mem(node); 33 for(int i=1;i<=n;i++){ 34 cin>>node[i].a; 35 node[i].b=i; 36 } 37 sort(node+1,node+1+n,cmp); 38 int cnt=0; 39 for(int i=1;i<=n;i++){ 40 cnt+=sum(node[i].b); 41 update(node[i].b); 42 } 43 cout<<cnt<<endl; 44 return 0; 45 }
字典树
1 #include <bits/stdc++.h> 2 #define N 100000 3 using namespace std; 4 int tree[N][26]; 5 int val[N]; 6 string s; 7 int pos = 1; 8 9 void insert(string s){ 10 int root = 0; 11 for(int i = 0; s[i]; i++){ 12 int an = s[i] - 'a'; 13 if(!tree[root][an]){ 14 tree[root][an] = pos++; 15 } 16 root = tree[root][an]; 17 } 18 val[root] = 1; 19 } 20 21 bool find(string s){ 22 int root = 0; 23 for(int i = 0; s[i]; i++){ 24 int an = s[i] - 'a'; 25 if(!tree[root][an]) 26 return 0; 27 root = tree[root][an]; 28 } 29 return 1; 30 } 31 32 int main(){ 33 cin >> s; 34 insert(s); 35 int n; 36 cin >> n; 37 for(int i = 0; i < n; i++){ 38 cin >> s; 39 if(find(s)) 40 cout<<"Yes"<<endl; 41 else 42 cout<<"No"<<endl; 43 44 } 45 return 0; 46 }
最小生成树
1 #include <iostream> 2 #include <algorithm> 3 #define N 50005 4 using namespace std; 5 6 int n, m; 7 struct Node{ 8 int x, y, val; 9 friend bool operator <(const Node &a, const Node &b){ 10 return a.val < b.val; 11 } 12 }node[N]; 13 14 int fa[N]; 15 int sum = 0; 16 int find(int x){ 17 return fa[x] == x? x: fa[x] = find(fa[x]); 18 } 19 int cnt = 0; 20 void kruskal(){ 21 for(int i = 0; i <= n; i++) 22 fa[i] = i; 23 for(int i = 0; i < m; i++){ 24 int ax = find(node[i].x); 25 int ay = find(node[i].y); 26 if(ax != ay){ 27 fa[ax] = ay; 28 sum += node[i].val; 29 cnt++; 30 } 31 if(cnt == n-1) 32 break; 33 } 34 } 35 36 37 int main(){ 38 cin >> n >> m; 39 for(int i = 0; i < m; i++){ 40 cin >> node[i].x >> node[i].y >> node[i].val; 41 } 42 sort(node, node+m); 43 kruskal(); 44 cout << sum << endl; 45 return 0; 46 }
加一个prim板子
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <queue> 5 #define N 1005 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 int n, m; 9 int an = inf; 10 struct Node{ 11 int to, val; 12 friend bool operator <(const Node &a, const Node &b){ 13 return a.val > b.val; 14 } 15 }; 16 int vis[N]; 17 vector<Node> v[N]; 18 priority_queue<Node> q; 19 void prim(){ 20 int cnt = 2; 21 while(!q.empty()){ 22 Node ans = q.top(); 23 q.pop(); 24 if(vis[ans.to]) 25 continue; 26 cnt ++; 27 an += ans.val; 28 vis[ans.to] = 1; 29 if(cnt == n) 30 break; 31 for(int i = 0; i < v[ans.to].size(); i++){ 32 Node p = v[ans.to][i]; 33 if(vis[p.to]) 34 continue; 35 q.push({p.to, p.val}); 36 } 37 } 38 } 39 40 int main(){ 41 cin >> n >> m; 42 int xx,yy; 43 int x, y, z; 44 for(int i = 0; i < m; i++){ 45 cin >> x >> y >> z; 46 v[x].push_back({y,z}); 47 v[y].push_back({x,z}); 48 if(z < an) xx = x, yy = y, an = z; 49 } 50 vis[xx] = vis[yy] = 1; 51 for(int i = 0; i < v[xx].size(); i++) 52 q.push({v[xx][i].to, v[xx][i].val}); 53 for(int i = 0; i < v[yy].size(); i++) 54 q.push({v[yy][i].to, v[yy][i].val}); 55 prim(); 56 cout << an <<endl; 57 return 0; 58 }
最短路
1 #include <bits/stdc++.h> 2 #define N 1000 3 #define inf 0x3f3f3f3f 4 using namespace std; 5 int n, m; 6 struct Node{ 7 int to, value; 8 friend bool operator<(const Node &a , const Node &b) 9 { 10 return a.value > b.value; // ascending sort 11 } 12 }; 13 vector<Node> v[N]; 14 int vis[N]; 15 int val[N]; 16 int ans = 0; 17 18 void short_path(int x){ 19 priority_queue<Node> q; 20 q.push({x,0}); 21 while(!q.empty()){ 22 Node node = q.top(); 23 q.pop(); 24 if(vis[node.to] == 1) 25 continue; 26 vis[node.to] = 1; 27 val[node.to] = min(val[node.to], node.value); 28 ans ++; 29 if(ans == n) break; 30 31 for(int i = 0; i < v[node.to].size(); i ++){ 32 Node an = v[node.to][i]; 33 if(vis[an.to] == 0){ 34 q.push({an.to, val[node.to]+an.value}); 35 } 36 } 37 } 38 } 39 40 int main(){ 41 int x, y, z; 42 while(cin >> n >> m && n != 0 && m != 0){ 43 memset(vis, 0, sizeof(vis)); 44 memset(val, inf, sizeof(val)); 45 ans = 0; 46 for(int i = 0; i < 1000; i++) 47 v[i].clear(); 48 for(int i = 0; i < m; i ++){ 49 cin >> x >> y >> z; 50 v[x].push_back({y, z}); 51 v[y].push_back({x, z}); 52 } 53 short_path(1); 54 cout<< val[n] << endl; 55 } 56 return 0; 57 }