Comet OJ - Contest #5 E 迫真大游戏
怎么说,看了推到之后真的不难,事实上确实也蛮友好(可能咱就是想不出多项式题目的做法???),除了用到了分治法法塔就比较毒瘤
花了一个晚上以及一个上午做这么一道题...(还是太菜了)
Result1
分治法法塔NB ,CMX NB
推导分为两步走:
Part1
第一步是求出游戏人数为 n 时,第一个人最后死亡的概率 \(f(n)\)
我们先写出 f 的公式:
\]
其中 i 为一轮下来死亡的人数,当然 1 号必然要存活
化简:
\]
容易看出是个卷积的形式,但 f 卷积式与自己有关,所以用分治法法塔解决,复杂度直上 \(n\log^2n\)
这样乱搞就是为了求出一个 \(f_n\) ?呵呵...
Part2
然后康康对于每个人他留到最后的概率
由于判定是从第一号角色开始的,那么我们把第 k 个人先搞到第一号角色,即假设先判了前面的 k-1 个人,死了 i 个,剩 n-i 个,这时候第 k 个人就是最先判定的那个了
\]
发现是个蛮朴素卷积...
Code
好菜的 zjq...
//by Judge (zlw ak ioi)
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=53e4+3;
typedef int arr[M];
int n,a,b,p,q,limit; arr f,A,B,r,fac,finv,inv,pwp,pwq;
char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline void Pls(int& x,int y){if((x+=y)>=mod)x-=mod;}
inline int inc(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int qpow(int x,int p=mod-2){ Rg int s=1;
for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
inline void init(int n){ Rg int len=-1;
limit=1; while(limit<n) limit<<=1,++len;
fp(i,1,limit-1) r[i]=(r[i>>1]>>1)|((i&1)<<len);
}
inline void NTT(int* a,int tp){
fp(i,1,limit-1) if(i<r[i]) swap(a[i],a[r[i]]);
for(Rg int i=1,I=2;i<limit;i<<=1,I<<=1){
Rg int Wn=qpow(tp?3:iG,(mod-1)/I);
for(Rg int j=0,y;j<limit;j+=I)
for(Rg int k=0,w=1;k<i;++k,w=mul(w,Wn)){
y=mul(a[j+k+i],w),a[j+k+i]=inc(a[j+k],mod-y),
a[j+k]=inc(a[j+k],y);
}
} if(!tp) fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
}
inline void Solv(int l,int r){ if(r==1) return ;
if(l==r) return f[l]=mul(f[l],mul(fac[l-1],qpow(mod+1-pwq[l]))),void();
Rg int md=(l+r)>>1; Solv(l,md),init(md+r-l-l);
fp(i,l,md) A[i-l]=mul(f[i],mul(pwq[i],finv[i-1]));
fp(i,1,r-l) B[i-1]=mul(pwp[i],finv[i]);
fp(i,md-l+1,limit-1) A[i]=0; fp(i,r-l,limit-1) B[i]=0;
NTT(A,1),NTT(B,1); fp(i,0,limit-1) A[i]=mul(A[i],B[i]);
NTT(A,0); fp(i,md+1,r) Pls(f[i],A[i-l-1]); Solv(md+1,r);
}
inline void Calc(){ init(n<<1);
fp(i,0,n-1) A[i]=mul(f[n-i],mul(pwp[i],finv[i])),B[i]=mul(pwq[i],finv[i]);
fp(i,n,limit-1) A[i]=B[i]=0; NTT(A,1),NTT(B,1);
fp(i,0,limit-1) A[i]=mul(A[i],B[i]); NTT(A,0);
fp(i,0,n-1) print(mul(A[i],fac[i])); Ot();
}
int main(){ cin>>n>>a>>b,p=mul(a,qpow(b)),q=mul(b-a,qpow(b));
init(n<<1),fac[0]=1; fp(i,1,limit) fac[i]=mul(fac[i-1],i);
finv[limit]=qpow(fac[limit]); fd(i,limit,1) finv[i-1]=mul(finv[i],i);
inv[0]=1; fp(i,1,limit) inv[i]=mul(finv[i],fac[i-1]);
pwp[0]=pwq[0]=1; fp(i,1,n) pwp[i]=mul(pwp[i-1],p),pwq[i]=mul(pwq[i-1],q);
return f[0]=0,f[1]=1,Solv(1,n),Calc(),0;
}
Result 2
嘤嘤嘤发现这个分治法法塔被 一只 log 的血腥推导吊打... 清雨姐姐NB
首先用 i 表示游戏进行了 i 轮之后, 1 号位 死了,且是最后死的概率(可能有点难理解 1 号位为什么要死,原因大概是因为是不这么算的话比较难表示,且容易出现相同的状况重复计算)
\]
发现也是卷积的形式呢,而且直接一只 log 就能处理出来,然后咱用 \(f_n\) 进行上述的操作就行了QwQ
//by Judge (zlw ak ioi)
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=53e4+3;
typedef int arr[M];
int n,a,b,p,q,limit; arr f,A,B,r,fac,finv,inv,pwp,pwq;
char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr='\n'){
if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline void Pls(int& x,int y){if((x+=y)>=mod)x-=mod;}
inline int inc(int x,int y){return (x+=y)>=mod?x-mod:x;}
inline int qpow(int x,int p=mod-2){ Rg int s=1;
for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
inline void init(int n){ Rg int len=-1;
limit=1; while(limit<n) limit<<=1,++len;
fp(i,1,limit-1) r[i]=(r[i>>1]>>1)|((i&1)<<len);
}
inline void NTT(int* a,int tp){
fp(i,1,limit-1) if(i<r[i]) swap(a[i],a[r[i]]);
for(Rg int i=1,I=2;i<limit;i<<=1,I<<=1){
Rg int Wn=qpow(tp?3:iG,(mod-1)/I);
for(Rg int j=0,y;j<limit;j+=I)
for(Rg int k=0,w=1;k<i;++k){
y=mul(a[j+k+i],w),a[j+k+i]=inc(a[j+k],mod-y),
a[j+k]=inc(a[j+k],y),w=mul(w,Wn);
}
} if(!tp) fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
}
inline void Calc(){ init(n<<1);
fp(i,0,n-1) A[i]=mul(mul(i&1?mod-1:1,qpow(mod+1-pwq[i+1])),finv[i]),B[i]=finv[i];
NTT(A,1),NTT(B,1); fp(i,0,limit-1) A[i]=mul(A[i],B[i]); NTT(A,0);
fp(i,1,n) f[i]=mul(mul(p,fac[i-1]),A[i-1]);
memset(A,0,(limit+1)<<2),memset(B,0,(limit+1)<<2);
fp(i,0,n-1) A[i]=mul(f[n-i],mul(pwp[i],finv[i])),B[i]=mul(pwq[i],finv[i]);
NTT(A,1),NTT(B,1); fp(i,0,limit-1) A[i]=mul(A[i],B[i]); NTT(A,0);
fp(i,0,n-1) print(mul(A[i],fac[i])); Ot();
}
int main(){ cin>>n>>a>>b,p=mul(a,qpow(b)),q=mul(b-a,qpow(b));
init(n<<1),fac[0]=1; fp(i,1,limit) fac[i]=mul(fac[i-1],i);
finv[limit]=qpow(fac[limit]); fd(i,limit,1) finv[i-1]=mul(finv[i],i);
inv[0]=1; fp(i,1,limit) inv[i]=mul(finv[i],fac[i-1]);
pwp[0]=pwq[0]=1; fp(i,1,n) pwp[i]=mul(pwp[i-1],p),pwq[i]=mul(pwq[i-1],q);
return f[0]=0,Calc(),0;
}
Comet OJ - Contest #5 E 迫真大游戏的更多相关文章
- Comet OJ - Contest #5 D 迫真小游戏 (堆+set)
迫真小游戏 已经提交 已经通过 时间限制:2000ms 内存限制:256MB 73.98% 提交人数:196 通过人数:145 题目描述 H君喜欢在阳台晒太阳,闲暇之余他会玩一些塔防小游戏. H君玩的 ...
- 【杂题】【CometOJ Contest #5】E:迫真大游戏【概率】【排列组合】【多项式】
Description 有一个n个点的环,有一个指针会从1号点开始向后扫描,每次扫描有p的概率删除当前点 询问每个点最后一个被删除的概率. 答案对998244353取模 n<=200000 So ...
- Comet OJ - Contest #5 简要题解
好久没更博了,还是象征性地更一次. 依然延续了简要题解的风格. 题目链接 https://cometoj.com/contest/46 题解 A. 迫真字符串 记 \(s_i\) 表示数字 \(i\) ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #5
Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
随机推荐
- [CSP-S模拟测试]:平方数(数学+哈希)
题目传送门(内部题137) 输入格式 第一行,一个正整数$n$. 第二行$n$个正整数$a_1\sim a_n$. 输出格式 输出一个整数,为满足条件的二元组个数. 样例 样例输入: 51 2 3 4 ...
- EDA cheat sheet
%config InlineBackend.figure_format = 'svg' 在jupyter notebook中使用这个命令绘制更清晰的图像,注意百分号后不能有空格. 1. Univari ...
- 【转】diamond专题(二)– 核心原理介绍
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- linux下文件权限更改(转载)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33571752/article/d ...
- 复制表结构和数据SQL语句(转)
http://www.cnblogs.com/zhengxu/articles/2206894.html 1.复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 ...
- sql总结-----基本查询
创建一个测试表,插入一些测试数据: Create Table Cstable (Id Int,Age Int,Name Varchar2(8),Address Varchar2(20)); Inser ...
- leetcode 146LRU cache
class LRUCache { public: LRUCache(int capacity) {_capacity=capacity;} //返回key对应的value int get(int ke ...
- 如何将打印内容转换为bmp位图文件
bmp是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BblP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8 ...
- 浏览器端-W3School-HTML:HTML DOM Anchor 对象
ylbtech-浏览器端-W3School-HTML:HTML DOM Anchor 对象 1.返回顶部 1. HTML DOM Anchor 对象 Anchor 对象 Anchor 对象表示 HTM ...
- Java学习之==>注释、数据类型、变量、运算符
一.注释 在Java中有3种标记注释的方式,最常用的方式是 // ,其注释的内容从 // 开始,到本行结束.但需要注意的是,我们不建议把注释写在代码的尾部(即尾注释),我们建议把注释写在代码的上一行, ...