Counting Cliques
题意:给定一个图,寻找节点数为s的完全子图有多少个
思路:点很少,可以暴力,但是因为是无向图,所以如果直接爆会有很多重复,会超时。可以转化为编号小的节点指向编号大的节点的有向图,从1-n节点开始进行n次dfs,这样就减少了大量的重复计算
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 110; 5 bool hadroad[maxn][maxn]; 6 bool vis[maxn]; 7 vector<int> G[maxn]; 8 9 int n, s, sum; 10 11 void init() { 12 for(int i = 0; i < maxn; i++) G[i].clear(); 13 memset(hadroad, false, sizeof hadroad); 14 for(int i = 0; i < maxn; i++) hadroad[i][i] = true; 15 memset(vis, false, sizeof vis); 16 sum = 0; 17 } 18 19 void dfs(int u, vector<int> &tmp) { 20 if(tmp.size() > s) return; 21 for(int i = 0; i < tmp.size(); i++) { 22 if(!hadroad[u][tmp[i]]) return; 23 } 24 if(tmp.size() == s) { sum++; return; } 25 for(int i = 0; i < G[u].size(); i++) { 26 int v = G[u][i]; 27 if(!vis[v]) { 28 vis[v] = true; 29 tmp.push_back(v); 30 dfs(v, tmp); 31 tmp.pop_back(); 32 vis[v] = false; 33 } 34 } 35 } 36 37 int main() { 38 //freopen("in.txt", "r", stdin); 39 int T, m, u, v; 40 scanf("%d", &T); 41 while(T--) { 42 scanf("%d%d%d", &n, &m, &s); 43 init(); 44 for(int i = 1; i <= m; i++) { 45 scanf("%d%d", &u, &v); 46 G[u].push_back(v); 47 hadroad[u][v] = hadroad[v][u] = true; 48 } 49 for(int i = 1; i <= n; i++) { 50 vis[i] = true; 51 vector<int> tmp; 52 tmp.push_back(i); 53 dfs(i, tmp); 54 vis[i] = false; 55 } 56 printf("%d\n", sum); 57 } 58 }
Recursive sequence
题意:对于F(n), 当n>=3时,F(n) = 2*F(n-2) + F(n-1) + n^4,给定n, a, b,其中F(1) = a, F(2) = b, 求F(n)
思路:很显然的矩阵快速幂,但是要对n^4进行处理,可由二项式定理求得n^4 = [(n - 1) + 1]^4 = C(0, 4)*(n-1)^4 + C(1, 4)*(n-1)^3 + C(2, 4)*(n-1)^2 + C(3, 4)*(n-1) + C(4, 4)*1
构建出来的矩阵为7阶, 具体可参考https://blog.csdn.net/qq_29980371/article/details/78183239
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod = 2147493647; 5 6 struct matrix { 7 ll m[8][8]; 8 matrix() { 9 memset(m, 0, sizeof m); 10 } 11 matrix operator * (const matrix & ans) { 12 matrix tmp; 13 for(int i = 1; i <= 7; i++) { 14 for(int j = 1; j <= 7; j++) { 15 for(int k = 1; k <= 7; k++) 16 tmp.m[i][j] = (tmp.m[i][j] + m[i][k]*ans.m[k][j]) % mod; 17 } 18 } 19 return tmp; 20 } 21 }; 22 23 matrix pow_mod(matrix m, ll n) { 24 matrix ans; 25 for(int i = 0; i <= 7; i++) ans.m[i][i] = 1; 26 while(n) { 27 if(n & 1) ans = ans * m; 28 m = m * m; 29 n >>= 1; 30 } 31 return ans; 32 } 33 34 int main() { 35 ll n, a, b, t; 36 cin >> t; 37 matrix A; 38 A.m[1][1] = 0;A.m[1][2] = 1;A.m[1][3] = 0;A.m[1][4] = 0;A.m[1][5] = 0;A.m[1][6] = 0;A.m[1][7] = 0; 39 A.m[2][1] = 2;A.m[2][2] = 1;A.m[2][3] = 1;A.m[2][4] = 4;A.m[2][5] = 6;A.m[2][6] = 4;A.m[2][7] = 1; 40 A.m[3][1] = 0;A.m[3][2] = 0;A.m[3][3] = 1;A.m[3][4] = 4;A.m[3][5] = 6;A.m[3][6] = 4;A.m[3][7] = 1; 41 A.m[4][1] = 0;A.m[4][2] = 0;A.m[4][3] = 0;A.m[4][4] = 1;A.m[4][5] = 3;A.m[4][6] = 3;A.m[4][7] = 1; 42 A.m[5][1] = 0;A.m[5][2] = 0;A.m[5][3] = 0;A.m[5][4] = 0;A.m[5][5] = 1;A.m[5][6] = 2;A.m[5][7] = 1; 43 A.m[6][1] = 0;A.m[6][2] = 0;A.m[6][3] = 0;A.m[6][4] = 0;A.m[6][5] = 0;A.m[6][6] = 1;A.m[6][7] = 1; 44 A.m[7][1] = 0;A.m[7][2] = 0;A.m[7][3] = 0;A.m[7][4] = 0;A.m[7][5] = 0;A.m[7][6] = 0;A.m[7][7] = 1; 45 while(t--) { 46 cin >> n >> a >> b; 47 matrix B, ans; 48 B.m[1][1] = a;B.m[2][1] = b;B.m[3][1] = 16;B.m[4][1] = 8;B.m[5][1] = 4;B.m[6][1] = 2;B.m[7][1] = 1; 49 ans = pow_mod(A, n-2); 50 ans = ans * B; 51 cout << ans.m[2][1] << endl; 52 } 53 }