2018 Multi-University Training Contest 9 Solution

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\n", 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\n", 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\n", 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\n", (qmod(n) - res + MOD) % MOD);
35     }
36     return 0;
37 }

原文地址:https://www.cnblogs.com/Dup4/p/9780451.html

时间: 2024-10-09 15:11:52

2018 Multi-University Training Contest 9 Solution的相关文章

2018 Multi-University Training Contest 1 Solution

A - Maximum Multiple 题意:给出一个n 找x, y, z 使得$n = x + y +z$ 并且 $n \equiv 0 \pmod x, n \equiv 0 \pmod y, n \equiv 0 \pmod z$ 并且使得 $x \cdot y \cdot z$ 最大 思路:设$a = \frac{n}{x}, b = \frac{n}{y}, c = \frac{n}{z}$ 那么 $\frac{1}{a} + \frac{1}{b} + \frac{1}{c} =

2018 Multi-University Training Contest 4 Solution

A - Problem A. Integers Exhibition 留坑. B - Problem B. Harvest of Apples 题意:计算$\sum_{i = 0}^{i = m}C(n, i)$ 思路:由$sum_{i = 0}^{i = m}C(n,i)$可以得到$sum_{i = 0}^{i = m + 1}C(n,i)$以及$sum_{i = 0}^{i = m}C(n + 1,i)$然后用莫对算法求解 1 #include<bits/stdc++.h> 2 3 usi

2018 Multi-University Training Contest 6 Solution

A - oval-and-rectangle 题意:给出一个椭圆的a 和 b,在$[0, b]中随机选择c$ 使得四个顶点在椭圆上构成一个矩形,求矩形周长期望 思路:求出每种矩形的周长,除以b(积分) 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const double PI = acos(-1.0); 6 7 double a, b; 8 9 void RUN() 10 { 11 int t; 12 scanf("%

2018 Nowcoder Multi-University Training Contest 2

Practice Link A. run 题意: 白云每次可以移动\(1\)米或者\(k\)米,询问移动的米数在\([L, R]\)范围内的方案数有多少. 思路: \(dp[i][2]\)表示到第\(i\)米,是通过\(1\)米的方式过来的还是\(k\)米的方式过来的,递推即可. 代码: #include <bits/stdc++.h> using namespace std; #define N 100010 const int p = 1e9 + 7; int f[N][2], g[N];

2018 Nowcoder Multi-University Training Contest 1

Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdots, a_n\)中有多少个不同的数. 思路: 先分别离线求出\(a_1, \cdots a_i\)以及\(a_j, \cdots, a_n\)中有多少个不同的数. 再考虑有多少个数既在\([1, i]\)中也在\([j, n]\)中,再离线做一次. 考虑一个数第一次出现的时候,那么这个数下一次出现

2018 Nowcoder Multi-University Training Contest 5

Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ \begin{eqnarray*} gpa = \frac{\sum s_ic_i}{\sum s_i} \end{eqnarray*} \] 思路: 首先删去的课程越多,gpa肯定不会变得更差. 所以我们肯定是删去\(k\)门课程. 考虑二分答案,check的时候要满足: \[ \begin{eq

2018 Multi-University Training Contest 3

2018 Multi-University Training Contest 2 题解 A - Problem A. Ascending Rating 题目描述:给定一个序列,分别求出所有长度为\(m\)的区间的\(maxrating, count\),对于每个长度为\(m\)的区间,一开始\(maxrating=-1, count=0\),然后从左往右扫,扫到一个大于\(maxrating\)的值时,\(count+1, maxrating=\)那个数. solution 从左往右做,用单调队

HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 5943    Accepted Submission(s): 2004 Problem Description Before

杭电2018多校第一场(2018 Multi-University Training Contest 1) 1001.Maximum Multiple (HDU6298)-数学思维题(脑子是个好东西,可惜我没有)

暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了... 2018 Multi-University Training Contest 1 HDU6298.Maximum Multiple 题目意思就是给你一个n,找出来三个数x,y,z, 使得n=x+y+z,而且x,y,z都是n的因数,并且x*y*z为最大值,让你输出来x*y*z的最大值.如果没有满足条件的情况就输出-1. 由1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4,所