补题日记[2022牛客暑期多校1]I-Chiitoitsu

Posted cls1277

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补题日记[2022牛客暑期多校1]I-Chiitoitsu相关的知识,希望对你有一定的参考价值。

Pro

https://ac.nowcoder.com/acm/contest/33186/I

Sol

最优策略:摸到的牌如果可以组成对,则丢一张单牌;否则丢掉这张牌

f s , r f_s,r fs,r表示当手牌中有 s s s张单牌,牌堆中剩余 r r r张牌时的期望,状态转移方程为:

则答案为 f 初始手牌中单牌个数 , 136 − 13 f_初始手牌中单牌个数,136-13 f初始手牌中单牌个数,13613

Code

//By cls1277
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Eo(i,x,_) for(LL i=head[x]; i; i=_[i].next)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define endl '\\n'

const LL mod = 1e9+7;
LL f[15][140];

LL qpow(LL x, LL y) 
    LL z = 1;
    while(y) 
        if(y&1) z = z*x%mod;
        x = x*x%mod;
        y >>= 1;
    
    return z%mod;


int main() 
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    #ifdef DEBUG
    freopen("data.txt","r",stdin);
    #endif
    for(int i=1; i<=13; i+=2) 
        Fo(j,1,136) 
            if(i==1) f[i][j] = (1+f[1][j-1]*(j-3)%mod*qpow(j,mod-2)%mod)%mod;
            else f[i][j] = (1+f[i-2][j-1]*3%mod*i%mod*qpow(j,mod-2)%mod+f[i][j-1]*(j-3*i)%mod*qpow(j,mod-2)%mod)%mod;
        
    
    LL t; cin>>t;
    Fo(tt, 1, t) 
        string str; cin>>str;
        map<string, LL> s;
        for(int i=0; i<str.length(); i+=2) 
            string ss = "";
            ss += str[i]; ss += str[i+1];
            s[ss]++;
        
        LL cnt = 0;
        for(auto it:s) 
            if(it.second&1) 
                cnt++;
            
        
        cout<<"Case #"<<tt<<": "<<f[cnt][123]<<endl;
    
    return 0;


以上是关于补题日记[2022牛客暑期多校1]I-Chiitoitsu的主要内容,如果未能解决你的问题,请参考以下文章

补题日记[2022牛客暑期多校4]A-Task Computing

补题日记[2022牛客暑期多校1]J-Serval and Essay

补题日记[2022牛客暑期多校1]D-Mocha and Railgun

补题日记[2022牛客暑期多校1]C-Grab the Seat

补题日记[2022牛客暑期多校2]H-Take the Elevator

补题日记[2022牛客暑期多校2]H-Take the Elevator