Description

有一个n个点的环,有一个指针会从1号点开始向后扫描,每次扫描有p的概率删除当前点

询问每个点最后一个被删除的概率。

答案对998244353取模

n<=200000

Solution

直接计算要考虑前后两部分比较麻烦,我们不妨先考虑1号点如何计算。

记\(f_n\)表示n个点的环1号点最后一个被删除的概率。

枚举一轮中删去了几个

\[f_n=\sum\limits_{i=0}^{n-1}p^i(1-p)^{n-i}{n-1\choose i}f_{n-i}
\]

把i=0那一项移过来,可以得到一个递推式,显然可以用分治FFT加速。

这样是两个log的,我们有更优秀的做法。

枚举1号点最后在第k+1轮被淘汰,那么其他点至多在第k轮就被淘汰

\[f_n=\sum\limits_{k\geq 0}p(1-p)^k(1-(1-p)^k)^{n-1}
\]

二项式展开

\[=\sum\limits_{k\geq 0}p(1-p)^k\sum\limits_{j=0}^{n-1}(-1)^j(1-p)^{kj}{n-1\choose j}
\]

交换主体,整理

\[=p\sum\limits_{j=0}^{n-1}(-1)^j{n-1\choose j}\sum\limits_{k\geq 0}(1-p)^{k(j+1)}
\]

\[=p\sum\limits_{j=0}^{n-1}(-1)^j{n-1\choose j}{1\over 1-(1-p)^{j+1}}
\]

直接FFT,就是一个log的了

有了f考虑计算最后的答案,我们只需要枚举第一轮中这一个点前面删除了多少个即可,剩下的部分这个点就是第一个人了。

记\(S_i\)为i号点的答案。

易得

\[S_i=\sum\limits_{j=0}^{i-1}{i-1\choose j}p^j(1-p)^{i-1-j}f_{n-i}
\]

也是一个FFT解决

总的时间复杂度\(O(n\log n)\)

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
const int M=524288;
const int mo=998244353;
typedef long long LL;
using namespace std;
LL js[M+1],ny[M+1];
LL n,pl;
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
namespace poly
{
int wi[M+1],bit[M+1],ns;
void prp()
{
wi[0]=1,wi[1]=ksm(3,(mo-1)/M);
fo(i,1,M)
{
wi[i]=(LL)wi[i-1]*wi[1]%mo;
bit[i]=(bit[i>>1]>>1)|((i&1)<<18);
}
ns=ksm(M,mo-2);
}
void DFT(int *a)
{
fo(i,0,M-1) if(i<bit[i]) swap(a[i],a[bit[i]]);
for(int h=1,l=M>>1;h<M;h<<=1,l>>=1)
{
for(int j=0;j<M;j+=h<<1)
{
int *x=a+j,*y=x+h,wn=wi[l],w=1,v;
for(int i=0;i<h;i++,x++,y++,w=(LL)w*wn%mo)
{
v=(LL)*y *w%mo;
*y=(*x-v+mo)%mo,*x=(*x+v)%mo;
}
}
}
}
void IDFT(int *a)
{
DFT(a);
fo(i,0,M-1) a[i]=(LL)a[i]*ns%mo;
reverse(a+1,a+M);
}
}
using namespace poly;
int a[M+1],b[M+1],f[M+1];
int main()
{
LL al,bl;
cin>>n>>al>>bl; js[0]=1;
fo(i,1,n) js[i]=js[i-1]*i%mo;
ny[n]=ksm(js[n],mo-2);
fod(i,n-1,0) ny[i]=ny[i+1]*(i+1)%mo;
pl=al*ksm(bl,mo-2)%mo;
LL v=1,r=(mo+1-pl)%mo;
fo(i,0,n-1)
{
a[i]=ny[i],b[i]=v*ksm((mo+1-r)%mo,mo-2)%mo*ny[i]%mo;
r=(1-pl+mo)%mo*r%mo;
v=mo-v;
}
prp();
DFT(a),DFT(b);
fo(i,0,M-1) a[i]=(LL)a[i]*b[i]%mo;
IDFT(a);
fo(i,1,n) f[i]=(LL)a[i-1]*js[i-1]%mo*pl%mo;
memset(a,0,sizeof(a)),memset(b,0,sizeof(b));
r=1;LL r1=1;
fo(i,0,n-1)
{
a[i]=ny[i]*r%mo*f[n-i]%mo,b[i]=ny[i]*r1%mo;
r=r*pl%mo,r1=r1*(mo+1-pl)%mo;
}
DFT(a),DFT(b);
fo(i,0,M-1) a[i]=(LL)a[i]*b[i]%mo;
IDFT(a);
fo(i,1,n) printf("%lld\n",(LL)a[i-1]*js[i-1]%mo);
}

【杂题】【CometOJ Contest #5】E:迫真大游戏【概率】【排列组合】【多项式】的更多相关文章

  1. Comet OJ - Contest #5 E 迫真大游戏

    怎么说,看了推到之后真的不难,事实上确实也蛮友好(可能咱就是想不出多项式题目的做法???),除了用到了分治法法塔就比较毒瘤 花了一个晚上以及一个上午做这么一道题...(还是太菜了) Result1 分 ...

  2. Comet OJ - Contest #5 D 迫真小游戏 (堆+set)

    迫真小游戏 已经提交 已经通过 时间限制:2000ms 内存限制:256MB 73.98% 提交人数:196 通过人数:145 题目描述 H君喜欢在阳台晒太阳,闲暇之余他会玩一些塔防小游戏. H君玩的 ...

  3. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  4. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  5. dp杂题(根据个人进度选更)

    ----19.7.30 今天又开了一个新专题,dp杂题,我依旧按照之前一样,这一个专题更在一起,根据个人进度选更题目; dp就是动态规划,本人认为,动态规划的核心就是dp状态的设立以及dp转移方程的推 ...

  6. wangkoala杂题总集(根据个人进度选更)

    CQOI2014 数三角形 首先一看题,先容斥一波,求出网格内选三个点所有的情况,也就是C(n*m,3);然后抛出行里三点共线的方案数:C(n,3)*m; 同理就有列中三点共线的方案数:n*C(m,3 ...

  7. 2019暑期金华集训 Day6 杂题选讲

    自闭集训 Day6 杂题选讲 CF round 469 E 发现一个数不可能取两次,因为1,1不如1,2. 发现不可能选一个数的正负,因为1,-1不如1,-2. hihoCoder挑战赛29 D 设\ ...

  8. Atcoder&CodeForces杂题11.7

    Preface 又自己开了场CF/Atcoder杂题,比昨天的稍难,题目也更有趣了 昨晚炉石检验血统果然是非洲人... 希望这是给NOIP2018续点rp吧 A.CF1068C-Colored Roo ...

  9. Codeforces 杂题集 2.0

      记录一些没有写在其他随笔中的 Codeforces 杂题, 以 Problemset 题号排序   1326D2 - Prefix-Suffix Palindrome (Hard version) ...

随机推荐

  1. Java 的不可变类 (IMMUTABLE CLASS) 和 可变类 (MUTABLE CLASS)

    一.简单定义不可变对象(Immutable Objects)即对象一旦被创建,它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects).当满足以下条件时,对 ...

  2. JS基础_强制类型转换-String

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 06 Django之模型层---多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  4. 使用Ant打包工具

    由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了.Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文件 ...

  5. 10、LNMP架构

    1LNMP架构概述 1.1.什么是LNMP  LNMP 是一套技术的组合,L = Linux,N = Nginx,M~ = MySQL,P~ = PHP 1.2.LNMP架构是如何工作的 首先Ngin ...

  6. ldap搭建

    yum install openldap openldap-servers openldap-clients -y #检查是否安装成功 slapd -VVopenldap的配置文件都在/etc/ope ...

  7. (持续更新中~~~)kafka--消息引擎与分布式流处理平台

    kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),一般更愿意称kafka是一款开源的消息引擎系统,只不过消息队列会耳熟一些.kafka主要应用于大数据 ...

  8. Centos 7 Samba服务安装

    Centos 7 Samba服务安装搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录. 查看是已安装samba包: rpm -qa | grep samba ...

  9. python django 重新安装不能创建项目

    这里仅给大家做个思路提醒: 1.如果在别的地方找到一样的问题那就按别的方法去解决 2.如果是创建startproject的时候 报错:no module named 'mysite'  这个的话就和 ...

  10. uestc summer training #3 线段树优化建边

    线段树建边 struct E { int value, modvalue; } a[MAXN << ]; pair<int, int> b[MAXN]; ], r[MAXN & ...