• 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
    ", ans);
    34     }
    35     return 0;
    36 }
    View Code

    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 }
    View Code

     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 }
    View Code
  • 相关阅读:
    Volatile关键字的解读
    JVM内存模型
    Redis为何是单线程的
    乐观锁&CAS问题
    String为什么要设置成Final类型
    后端开发之光!Django应用的容器化部署实践~
    一小时完成后台开发:DjangoRestFramework开发实践
    Django快速开发实践:Drf框架和xadmin配置指北
    Django应用部署:nginx+uwsgi方式
    Python踩坑:类与类对象类型参数传递与使用
  • 原文地址:https://www.cnblogs.com/Dup4/p/9780451.html
Copyright © 2020-2023  润新知