首页 > 其他分享 >qoj8171 Cola 题解

qoj8171 Cola 题解

时间:2024-02-07 20:55:56浏览次数:30  
标签:qoj8171 ch frac int 题解 pref times le Cola

题目链接

点击打开链接

题目解法

很牛的题!!!会不了一点

令 \(pref_i\) 表示第 \(i\) 轮知道了前缀 \([1,...,i]\)
考虑怎样的 \(pref\) 序列是合法的(即采用最优策略):

  1. \(pref_0=0\)
  2. \(\forall_{i\in [0,n-1]}\;pref_i\le pref_{i+1}\)
  3. \(pref\) 中 \(x\) 的出现次数 \(\le n-x-1\),因为我们至多花 \(n-x-1\) 次可以排除掉所有错误的,剩下一次一定可以选到对的

考虑对于固定的一个 \(pref\) 数组的概率
假设其中 \(x\) 出现了 \(c_x\) 次
考虑从数字 \(x\) 变化到数字 \(x+1\),且数字 \(x\) 选错了 \(c_x\) 次的概率(即不按照轮数算,即使 \(c_x=0\) 也会计算到)为:
\(\frac{n-x-1}{n-x}\times \frac{n-x-2}{n-x-1}\times ...\times \frac{n-x-(c_x-1)}{n-x-c_x}\times \frac{1}{n-x-(c_x-1)}=\frac{1}{n-x}\)
很惊奇地发现,最终得到的概率与 \(c_x\) 无关,且把每个数变成下一个数的概率乘起来,恰好为 \(\frac{1}{n!}\)

我们现在的问题是计算合法的 \(pref\) 数组的数量
转化一下问题(一个比较直接的想法是转成网格图计数路径):从 \((0,0)\) 到 \((m-1,n)\) 的方案数(只能往右或往下),满足 \(\forall i\in [0,n-1]\) 第 \(i\) 行走的步数 \(\le n-i-1\),这里注意没有限制第 \(n\) 行
考虑容斥,我们钦定集合 \(S\) 中的行 \(x\) 有至少 \(n-x\) 步,那么答案显然为 \(\binom{n+m-1-\sum\limits_{x\in S} n-x}{n}\times (-1)^{|S|}\)
变换一下形式,把 \(S\) 的可选集合变为 \(\{1,...,n\}\),答案为 \(\binom{n+m-1-\sum\limits_{x\in S} x}{n}\times (-1)^{|S|}\)

用多项式来刻画这个式子,即为 \(\sum \binom{n+m-1-q}{n} [x^q]\prod\limits_{i=1}^n {(1-x^i)}\)
观察到 \(q\le m\),且 \(m\le n\) 的条件很特殊
考虑 \([x^q]\prod\limits_{i=1}^n {(1-x^i)}\) 等价于 \([x^q]\prod\limits_{i=1}^{\infty} {(1-x^i)}\)
用一下五边形数定理,就可以 \(O(\sqrt m)\) 求所有项的系数了

时间复杂度为 \(O(n+m)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=20000010,P=998244353;
int n,m,ifac[N],fac[N];
int qmi(int x,int y){
    int res=1;
    for(;y;y>>=1){ if(y&1) res=1ll*res*x%P;x=1ll*x*x%P;}
    return res;
}
void comb(int n){
    fac[0]=1;F(i,1,n) fac[i]=1ll*fac[i-1]*i%P;
    ifac[n]=qmi(fac[n],P-2);DF(i,n-1,0) ifac[i]=1ll*ifac[i+1]*(i+1)%P;
}
int C(int x,int y){ if(y<0||x<y) return 0;return 1ll*fac[x]*ifac[y]%P*ifac[x-y]%P;}
int main(){
    n=read(),m=read();m--;
    comb(n+m);
    int ans=C(n+m,n);
    for(int k=1;(3*k*k-k)/2<=m;k++){
        int v=C(n+m-(3*k*k-k)/2,n)+C(n+m-(3*k*k+k)/2,n);
        if(k&1) ans=(ans-1ll*v)%P;
        else ans=(ans+1ll*v)%P;
    }
    ans=1ll*ans*ifac[n]%P;
    printf("%d\n",(ans+P)%P);
    return 0;
}

标签:qoj8171,ch,frac,int,题解,pref,times,le,Cola
From: https://www.cnblogs.com/Farmer-djx/p/18011279

相关文章

  • [AGC021E] Ball Eat Chameleons 题解
    Description有\(n\)只变色龙,一开始都是蓝色。现在你喂了\(k\)次球,每次指定一只变色龙吃下你指定颜色的球。一只变色龙从蓝色变成红色当且仅当它吃的红球比蓝球多;一只变色龙从红色变成蓝色当且仅当它吃的蓝球比红球多。求最后能使所有变色龙都变成红色的方案数。两个方案......
  • AT_abc270_g [ABC270G] Sequence in mod P 题解
    题目传送门前置知识大步小步算法解法递推式为\(x_{n}=(ax_{n-1}+b)\bmodp\),发现可以统一消去\(\bmodp\),只在最后参与计算。以下过程省去模运算。当\(x_{0}=t\)时,则\(n=0\)即为所求。当\(a=0,x_{0}\net\)时,递推式转化为\(x_{n}=b\bmodp\)。若\(b=t\),则......
  • UVA10225 Discrete Logging 题解
    题目传送门前置知识大步小步算法题意多组询问,每次询问依次给定\(p,a,b\),求\(a^{x}\equivb\pmod{p}\)的最小非负整数解,其中\(a,p\)互质。解法BSGS板子题,不做过多介绍。貌似本题比P3846[TJOI2007]可爱的质数/【模板】BSGS和BZOJ3239DiscreteLogging数据较强......
  • [AGC041F] Histogram Rooks 题解
    题目链接点击打开链接题目解法好牛(难)的题!!!所有都被覆盖不难想到容斥暴力的容斥是钦定集合\(S\)中的位置都没被覆盖,然后把不能填棋子的点都去掉,假设剩下的不受限制的点的个数为\(c\),则答案为\(\sum2^c(-1)^{|S|}\)这个暴力是很难直接优化的如果一列被有点被钦定了,那么......
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
    [NOIP2015普及组]扫雷游戏题目背景NOIP2015普及组T2题目描述扫雷游戏是一款十分经典的单机小游戏。在行列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的......
  • UVA12024 Hats 题解
    题目传送门前置知识错位排列题意有\(t\)组询问,每次询问给定一个\(n\),表示有\(n\)个人,每人各有一个属于自己的帽子,求所有人都带错帽子的概率(不要求约分至最简形式)。解法错排板子题,\(\dfrac{D_{n}}{A_{n}^{n}}\)即为所求。代码#include<bits/stdc++.h>usingnamespac......
  • CF231E 题解
    本文采用CCBY-NC-SA4.0协议发布。前言提供一个圆方树做法。孩子圆方树学傻了,忘了还有缩点这回事。正文建圆方树。考虑一条圆方树上的路径,哪些点对答案有贡献:方点,这表示路径经过一个环,方案数\(\times2\).旁边有方点的圆点。这表示走到这时可以选择在环上绕一圈,方......
  • 洛谷P10136 暨 USACOJan2024S T3 题解
    题意简述原题已经很简了,没有什么简述的必要了。思维路径请注意本题解可以保证正确性但不保证如果有极端的Hack数据能够通过。拿到这道题上来的暴力想必是很容易的,即枚举每个\(L\)判断是否合法。接着我们就考虑优化,减少需要枚举的\(L\)的量。题目中要求余数最多有\(3\)......
  • CF1408F Two Different 题解
    解题思路先考虑如何将一堆数变为相同的。显然,这里有一个条件\(n=2^k,k\in\mathbbZ\),证明如下:每次操作只能将两个数变为相同的,那么一个数在使得其他数变为相同数的操作中(我们不妨将所有数进行这种操作称为一轮操作),一个数最多被使用一次;按照错位操作,即第一轮\(1\)和\(2\)......
  • CF1428D Bouncing Boomerangs 题解
    解题思路很简单的贪心。观察发现以下性质:当\(a_i=2\)时,这一行一定只有两个目标,且第二个目标一定位于一个\(a_j=1\)的格子内;当\(a_i=3\),那么当前列右边某一列发生转向的地方,\(a_j\not=0\);那么这道题就基本已经做出来了。因为\(a_i=3\)的格子转向格可以在任意非\(0\)......