首页 > 其他分享 >XXI Open Cup, Grand Prix of Tokyo:B题

XXI Open Cup, Grand Prix of Tokyo:B题

时间:2024-09-02 11:37:35浏览次数:7  
标签:方案 Tokyo Cup int 题解 ll 删掉 Prix 操作

前言

逆天计数坐牢局,上来一看10道题全mod 998244353,就知道不对劲。大约前3小时我和队友们在轮番思考除DFJ以外的所有题(我甚至试了无数种dp方法写A,赛后一看题解直接傻眼),后面开始专攻BGI。4小时多,队友开出了B,比赛快结束的时候,我终于过掉了I。赛后我一边看题解一边看队友代码研究B,然而题解有点简略,我一晚上没看懂……今天终于懂了,来写一篇详细的题解。

我真傻,真的。


B. Bit Operation

题意

给定一个01序列a,可以执行n-1次如下操作:选择相邻的两个数a[i]和a[i+1],将它们替换为a[i] & a[i+1]或a[i] | a[i+1](这是两种不同的操作)。问有多少种方案,可以使最后剩下的那一个数是1。

解法

考虑题中给出的操作,选定的两个数只有四种可能的情况:

 0 & 0 = 0, 0 | 0 = 0
 1 & 1 = 1, 1 | 1 = 1
 0 & 1 = 0, 0 | 1 = 1
 1 & 0 = 0, 1 | 0 = 1

可以发现,如果两个数有0有1,&可以看作删掉其中的1,|可以看作删掉其中的0;如果两个数相同,&可以看作取左边的数,|可以看作取右边的数(当然,左右反过来也一样)。那么这个操作就可以等价于:

选择两个相邻的数,删掉其中一个;删左和删右是两种不同的操作。

这样就可以枚举a中每一个1,作为最后留下来的数。接下来考虑把选定的位置左右两端的所有数全部删掉的方案数。先考虑删除a[i](i不是选定的位置)的方案数。如果i=1,那么只能取a[1]和a[2],删除a[1],也就是只有一种方案。i=n与此同理。否则,可以取a[i-1]和a[i],删除a[i],或者取a[i]和a[i+1],删除a[i],也就是有两种方案。即:删掉第一个数的方案只有一种,而删掉其他数的方案都有2种
用p[i]表示选定位置的某一侧有i个数时,把它们全部删掉的方案数。显然,p[0] = 1。由上述结论,这一侧有i个数时,第一次操作有(1+2i)种选择。做完这次操作,还剩i-1个数,全部删掉的方案数就是p[i-1]。所以可以通过

p[0] = 1;
for(int i = 1; i <= n; i++){
    p[i] = p[i - 1] * (i * 2 - 1);
}

得出删掉一侧任意个数的方案数(实际做题注意取模)。

由于左右两端的操作可以相互穿插,假设选定的位置是i,那也就是说总共做了n-1次操作,其中有i-1次是对左边进行的,所以答案要再乘上组合数C(n-1, i-1)。i位置的最终答案就是p[i-1] * p[n-i] * C(n-1, i-1)。最后把所有选定位置的答案加起来即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
const ll P = 998244353;

int n, a[N];
ll p[N], inv[N], c[N], ans;

ll fastpow(ll x, ll y){
    ll ret = 1;
    while(y){
        if(y & 1) ret = ret * x % P;
        x = x * x % P;
        y >>= 1;
    }
    return ret;
}

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }

    //p[i]表示选定的数的某一侧有i个数时,删掉这些数的方案数
    p[0] = 1;
    for(int i = 1; i <= n; i++){
        p[i] = p[i - 1] * (i * 2 - 1) % P;
    }

    //inv[i]是i的逆元
    for(int i = 1; i <= n; i++){
        inv[i] = fastpow((ll)i, P - 2);
    }

    //c[i]表示组合数C(n - 1, i)
    c[0] = 1;
    for(int i = 1; i <= n; i++){
        c[i] = (c[i - 1] * (n - i) % P) * inv[i] % P;
    }

    //对每个a[i] = 1的位置求出答案
    for(int i = 1; i <= n; i++){
        if(a[i]){
            ans = (ans + (p[i - 1] * p[n - i] % P) * c[i - 1] % P) % P;
        }
    }
    printf("%lld\n", ans);
    return 0;
}

标签:方案,Tokyo,Cup,int,题解,ll,删掉,Prix,操作
From: https://www.cnblogs.com/qjsswz/p/18392414

相关文章

  • 浅谈 Occupancy
    01研究意义OccupancyNetwork算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。OccupancyNetwork算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法去预测每个......
  • The 1st Universal Cup. Stage 8: Slovenia
    Preface这场其实是昨天打的,但因为今天没训练就摆烂拖到今天才补题和写博客这场题感觉都挺可做的,但前期出题有点慢导致后期没时间了,徐神和祁神赛后20min过了J有点可惜A.Bandits题都没看,不做评价B.CombinationLocks不难发现这题本质就是在0/1串上操作,每次移动到另......
  • The 3rd Universal Cup. Stage 7- Warsaw
    B.MissingBoundaries给\(N\)个区间,可能存在一些区间的端点不确定。现在你要指定区间的端点,是否可以使得所有不重不漏的覆盖\([1,L]\)首先考虑两个端点都确定的区间,两两之间应该不相交。考虑只有一个端点的区间,对于已经被确定的点,一定不能是在已被覆盖的区间内。其次所有的......
  • The 1st Universal Cup. Stage 7: Zaporizhzhia
    Preface在寝室白兰了一周多后也是终于等到徐神归来开始训练了这场的题感觉比较偏数学了,感觉和之前打的一个Tokyo的OpenCup很像,因此后期挺坐牢的4h左右堪堪写出7题,最后全队RushD结果发现暴力打表都打错了,怎么回事呢A.SquareSum这题在去年暑假前集训数学专题中......
  • The 3rd Universal Cup. Stage 1: St. Petersburg Finalized Standings
    C.CherryPicking这道题用了一个类似ODT的题思路。首先我们可以想到是,如果删除某些选手,只有可能会导致区间的合并,不会导致区间的分裂。所以我们可以枚举一下$x$的值,然后找到需要删除的点。用set​维护相同且相邻区间,找到删除点所在的区间后,给区间长度减一。如果区间长度为空......
  • 题解:CF1032B Personalized Cup
    本题题意给一个字符串,将其分成等长度的字符串,但是分的行数不能超过\(5\)行,每行的长度不得超过\(20\)。如果无法等分的,则用*来补足长度。输出在行数最小的前提下,列数最少的一种方案。思路由于字符串范围最多也就\(20\times5\),直接分类讨论即可。ACcode#include<bits/st......
  • 【WCET 户厕】2nd Qingbai Cup
    T1考虑二分,然后怎么check。我们随便选一个点开始BFS地移动,如果以它为左上角的正方形可以覆盖整个局面中的所有空格子,那么整个边长就是可行的。容易证明随便选一个点开始是正确的。T2抽象题。看到数据范围容易有一个状压状物,然而\(2^n\)怎么都去不掉。根据某年NOI或W......
  • XXI Open Cup, Grand Prix of Tokyo
    Preface神秘沟槽Counting大赛,十个题全是模\(998244353\)有点逆天了开场发现G是去年暑假前集训的原,然后坐牢了大半天看榜发现包大爷切了B,然后跟了一手接下来慢慢把所有题都看了一遍,每个题都属于有点思路但不多中间和祁神把诈骗题I玩出来了,然后对着H硬套「PKUWC2018......
  • 【待做】【AI+安全】数据集:KDD CUP99
    https://mp.weixin.qq.com/s?__biz=Mzg5MTM5ODU2Mg==&mid=2247494059&idx=1&sn=fdbfa26d8a3fc53596e5c8fe061f22a6&chksm=cfcf5966f8b8d0709e0992983b7ea9ebfc4f0331758b732394515e75eda99f82cd4829128144&scene=21#wechat_redirect[当人工智能遇上安全]6.基于机器学习......
  • Python数据预处理+正态性检验+异常值处理+Q-Q图-K-S检验+相关性分析(2024MathorCup A题
    #数据预处理#正态性检验、Q-Q图、箱线图、直方图、相关性分析#Q-Q图importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromscipy.statsimportnormfromscipy.statsimportprobplota=pd.read_excel('附件1:小区基本信息.xlsx',engine='openpyxl'......