A - Rikka with Nash Equilibrium
题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次。
思路:从大到小的放置,每一个都可以拓展一行拓展一列或者放在已经拓展的行列焦点,用记忆化搜索/dp即可
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 int n, m; 8 ll p; 9 ll dp[81][81][81 * 81]; 10 11 ll DFS(int x, int y,int z) 12 { 13 if(z >= n * m) return 1; 14 if(dp[x][y][z] != -1) return dp[x][y][z]; 15 ll res = 0; 16 if(x < n) res = (res + y * (n - x) % p * DFS(x + 1, y, z + 1)) % p; 17 if(y < m) res = (res + x * (m - y) % p * DFS(x, y + 1, z + 1)) % p; 18 if(x * y > z) res = (res + (x * y - z) * DFS(x, y, z + 1)) % p; 19 dp[x][y][z] = res; 20 return res; 21 } 22 23 int main() 24 { 25 int t; 26 scanf("%d", &t); 27 while(t--) 28 { 29 scanf("%d %d %lld", &n, &m, &p); 30 memset(dp, -1, sizeof dp); 31 ll ans = DFS(1, 1, 1); 32 ans = n * m % p * ans % p; 33 printf("%lld ", ans); 34 } 35 return 0; 36 }
B - Rikka with Seam
留坑。
C - Rikka with APSP
留坑。
D - Rikka with Stone-Paper-Scissors
题意:每个人有三种牌,"石头、剪刀、布" ,询问第一个人赢第二个人的期望
思路:考虑每一次出牌的概率相同,那么答案就是(赢的情况种数 - 输的情况) / 牌数 那么所有赢输情况种类数就是 $frac {a_1 *(b_2 - c_2) + b_1 * (c_2 - a_2) + c_1 * (a_2 - b_2)} {a + b + c} $
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 typedef long long ll; 6 7 ll gcd(ll a, ll b) 8 { 9 return b == 0 ? a : gcd(b, a % b); 10 } 11 12 ll a1, b1, c1, a2, b2, c2; 13 14 int main() 15 { 16 int t; 17 scanf("%d", &t); 18 while(t--) 19 { 20 scanf("%lld %lld %lld %lld %lld %lld", &a1, &b1, &c1, &a2, &b2, &c2); 21 ll ans = a1 * (b2 - c2) + b1 * (c2 - a2) + c1 * (a2 - b2); 22 if(ans % (a1 + b1 + c1) == 0) 23 { 24 ans /= a1 + b1 + c1; 25 printf("%lld ", ans); 26 } 27 else 28 { 29 int flag = 0; 30 if(ans < 0) 31 { 32 ans = -ans; 33 flag = 1; 34 } 35 ll ans2 = a1 + b1 + c1; 36 ll GCD = gcd(ans, ans2); 37 ans /= GCD; 38 ans2 /= GCD; 39 if(flag) printf("-"); 40 printf("%lld/%lld ", ans, ans2); 41 } 42 } 43 return 0; 44 }
E - Rikka with Rain
留坑。
F - Rikka with Spanning Tree
留坑。
G - Rikka with Treasure
留坑。
H - Rikka with Line Graph
留坑。
I - Rikka with Bubble Sort
留坑。
J - Rikka with Time Complexity
留坑。
K - Rikka with Badminton
题意:四种人,一种人啥都没有,一种人有拍,一种人有球,一种人有拍有球,求方案数使得有两拍一球
思路:考虑三种选择方案
1° 两个有拍+一个有球
2°两个有拍有球
3°一个有拍,一个有拍有球
答案就是$2^a cdot 2^c cdot (2^b - 1) cdot (2^d - 1) + 2^a cdot 2^c cdot (2^d - 1 - d) + 2^a cdot (2^b - 1 - b) cdot (2^c - 1)$
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 6 const ll MOD = 998244353; 7 8 ll qmod(ll n) 9 { 10 ll res = 1; 11 ll base = 2; 12 while (n) 13 { 14 if (n & 1) res = res * base % MOD; 15 base = base * base % MOD; 16 n >>= 1; 17 } 18 return res; 19 } 20 21 int t; 22 ll a, b, c, d; 23 24 int main() 25 { 26 scanf("%d", &t); 27 while (t--) 28 { 29 scanf("%lld%lld%lld%lld", &a, &b, &c, &d); 30 ll n = a + b + c + d; 31 ll res = qmod(a) * qmod(c) % MOD * (qmod(b) - 1 + MOD) % MOD * (qmod(d) - 1 + MOD) % MOD; 32 res = (res + qmod(a) * qmod(c) % MOD * (qmod(d) - 1 - d + MOD) % MOD) % MOD; 33 res = (res + qmod(a) * (qmod(b) - 1 - b + MOD) % MOD * (qmod(c) - 1 + MOD)) % MOD; 34 printf("%lld ", (qmod(n) - res + MOD) % MOD); 35 } 36 return 0; 37 }