2016沈阳区域赛题解

题目链接:https://vjudge.net/contest/178453#overview

A题:签到,略

B题:签到,略

C题:矩阵快速幂。推出一个 7*7 的矩阵即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 const LL MOD = 2147493647;
 6 int a, b;
 7 LL C[7][7];
 8 
 9 void mut(LL A[][7], LL B[][7]) {
10     memset(C, 0, sizeof(C));
11     for(int i = 0; i < 7; ++i)
12         for(int j = 0; j < 7; ++j)
13             for(int k = 0; k < 7; ++k)
14                 C[i][j] = ( C[i][j] + A[i][k] * B[k][j] ) % MOD;
15     memcpy(A, C, sizeof(C));
16 }
17 
18 LL qpow(int n) {
19     LL aa[7][7] = {{1,2,1,0,0,0,0},{1,0,0,0,0,0,0},{0,0,1,4,6,4,1},{0,0,0,1,3,3,1},{0,0,0,0,1,2,1},{0,0,0,0,0,1,1},{0,0,0,0,0,0,1}};
20     LL ans[7][7] = {{1,0,0,0,0,0,0},{0,1,0,0,0,0,0},{0,0,1,0,0,0,0},{0,0,0,1,0,0,0},{0,0,0,0,1,0,0},{0,0,0,0,0,1,0},{0,0,0,0,0,0,1}};
21     while(n) {
22         if(n&1) mut(ans, aa);
23         mut(aa,aa);
24         n>>=1;
25     }
26     LL res = ans[0][0] * b % MOD + ans[0][1] * a % MOD + ans[0][2] * 3 * 3 * 3 * 3 % MOD;
27        res = res + ans[0][3] * 3 * 3 * 3 % MOD + ans[0][4] * 3 * 3 % MOD + ans[0][5] * 3 % MOD;
28        res = ( res + ans[0][6] ) % MOD;
29     return res;
30 }
31 
32 int main() {
33     int T;
34     scanf("%d", &T);
35     while(T--) {
36         int n;
37         scanf("%d%d%d", &n, &a, &b);
38         if(n == 1) {
39             printf("%d\n",a);
40             continue;
41         }
42         LL ans = qpow(n-2);
43         printf("%lld\n", ans);
44     }
45     return 0;
46 }
View Code

D题:空

E题:暴力

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 using namespace std;
 6 const int maxn = 100 + 10;
 7 const int maxm = 1000 + 100;
 8  
 9 int n, m, k;
10 vector<int> v[maxn];
11 int from[maxm], to[maxm];
12 int G[maxn][maxn];
13 int d[maxn], node[maxn];
14 int tot, ans;
15  
16 void DFS(int x, int start)
17 {
18     if (tot == k) { ++ans; return; }
19  
20     int sz = v[x].size();
21     for (int i = start; i < sz; i++)
22     {
23         int flag = 0;
24         for (int j = 2; j <= tot; j++)
25         if (!G[ node[j] ][ v[x][i] ]) { flag = 1; break; }
26  
27         if (flag) continue;
28  
29         node[++tot] = v[x][i], DFS(x, i+1), --tot;
30     }
31 }
32  
33 int main()
34 {
35     int t;
36     scanf("%d", &t);
37     for (int ca = 1; ca <= t; ca++)
38     {
39         memset(d, 0, sizeof(d));
40         for (int i = 1; i <= n; i++)
41         {
42             for (int j = i+1; j <= n; j++) G[i][j] = G[j][i] = 0;
43             v[i].clear();
44         }
45  
46         scanf("%d%d%d", &n, &m, &k);
47         for (int i = 1; i <= m; i++)
48         {
49             scanf("%d%d", &from[i], &to[i]);
50             d[ from[i] ]++, d[ to[i] ]++;
51         }
52  
53         for (int i = 1; i <= m; i++)
54             if (d[ from[i] ] >= k-1 && d[ to[i] ] >= k-1)
55             {
56                 if (from[i] < to[i]) v[ from[i] ].push_back(to[i]);
57                     else v[ to[i] ].push_back(from[i]);
58                 G[ from[i] ][ to[i] ] = G[ to[i] ][ from[i] ] = 1;
59             }
60  
61         ans = 0;
62         for (int i = 1; i <= n; i++)
63         {
64             tot = 1, node[1] = i;
65             DFS(i, 0);
66         }
67  
68         printf("%d\n", ans);
69     }
70 }
View Code

F题:空

G题:二分+积分,这个题充分展现了微积分是多么的重要,Orz......辛普森积分并不能AC,eps小一点就T,大一点就WA,这数据出的真好.......据说现场赛机子贼快?辛普森可以过????这个积分具体怎么推导式子看这篇blog:https://blog.csdn.net/danliwoo/article/details/53002695

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 const double eps = 1e-10;
 7 const double pi = acos(-1);
 8 
 9 double MID;
10 
11 double getans(double mid)
12 {
13     return pi*cos(mid) - mid*cos(mid) + sin(mid) - 1.0/3.0*sin(mid)*sin(mid)*sin(mid);
14 }
15 
16 bool check(double mid, double d)
17 {
18     MID = mid;
19     double ans = 1/tan(mid)*getans(acos(tan(mid)*2-1));
20     if(ans-d*pi > eps) return false;
21     return true;
22 }
23 
24 int main() {
25     int T;
26     scanf("%d", &T);
27     for(int ca = 1; ca <= T; ++ca) {
28         double d, ans = 0;
29         scanf("%lf", &d);
30         if(d >= 1) {
31             ans = pi*sqrt(2*2+4*(2-d)*(2-d))/2;
32         }else {
33             double l = 0, r = pi/4;
34             while(r-l > eps) {
35                 double mid = (l+r)/2;
36                 if(check(mid,d)) {
37                     l = mid;
38                 }else {
39                     r = mid;
40                 }
41             }
42             l = tan(l)*2;
43             double jd = acos(1-l);
44             double area = jd - sin(jd)*cos(jd);
45             jd = atan(2.0/l);
46             ans = area/cos(jd);
47         }
48         printf("%.5f\n", ans);
49     }
50     return 0;
51 }
View Code

H题:空

I 题:空

J题:空

K题:空

posted @ 2018-10-09 14:18  DyastySun  阅读(362)  评论(0编辑  收藏  举报