2016沈阳区域赛题解
题目链接:https://vjudge.net/contest/178453#overview
A题:签到,略
B题:签到,略
C题:矩阵快速幂。推出一个 7*7 的矩阵即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
D题:空
E题:暴力
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
F题:空
G题:二分+积分,这个题充分展现了微积分是多么的重要,Orz......辛普森积分并不能AC,eps小一点就T,大一点就WA,这数据出的真好.......据说现场赛机子贼快?辛普森可以过????这个积分具体怎么推导式子看这篇blog:https://blog.csdn.net/danliwoo/article/details/53002695
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
H题:空
I 题:空
J题:空
K题:空