2016ACM/ICPC亚洲区沈阳站

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 }

猜你喜欢

转载自www.cnblogs.com/tcctw/p/9745954.html