[atARC061F]Card Game for Three
记录每一次操作的玩家为操作序列(去掉第一次),需要满足:$a$的个数为$n$且以$a$为结尾,$b$和$c$的个数分别不超过$m$和$k$
其所对应的概率:每一个字符恰好确定一张卡牌,因此即$3^{n+m+k-|s|}$
暴力枚举$b$和$c$的个数,即$\sum_{i=0}^{m}\sum_{j=0}^{k}{n+i+j-1\choose i}{n+j-1\choose j}3^{m+k-i-j}$
将组合数用阶乘展开,即$\sum_{i=0}^{m}\sum_{j=0}^{k}\frac{(n+i+j-1)!3^{m+k-i-j}}{(n-1)!i!j!}$
枚举$i+j=s$,即$\frac{\sum_{s=0}^{m+k}(n+s-1)!3^{m+k-s}\sum_{0\le i\le m,0\le s-i\le k}\frac{1}{i!(s-i)!}}{(n-1)!}$
关于后者显然是一个多项式乘法的形式,但由于模数是$10^{9}+7$,需要写一个拆系数fft/三模数ntt,复杂度为$o(n\log n)$且常数较大

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define M (1<<20)
5 #define mod 1000000007
6 #define K 40000
7 #define cd complex<double>
8 #define PI acos(-1.0)
9 int n,m,k,ans,fac[M],inv[N],mi[M],rev[M];
10 cd a1[M],a2[M],b1[M],b2[M],c1[M],c2[M],c3[M],w[M];
11 void fft(cd *a,int p){
12 for(int i=0;i<M;i++)
13 if (i<rev[i])swap(a[i],a[rev[i]]);
14 for(int i=2;i<=M;i<<=1)
15 for(int j=0;j<M;j+=i)
16 for(int k=0;k<(i>>1);k++){
17 cd s=w[(i>>1)+k];
18 if (p)s=conj(s);
19 cd x=a[j+k],y=a[j+k+(i>>1)]*s;
20 a[j+k]=x+y;
21 a[j+k+(i>>1)]=x-y;
22 }
23 if (p){
24 for(int i=0;i<M;i++)a[i]/=M;
25 }
26 }
27 int main(){
28 fac[0]=inv[0]=inv[1]=mi[0]=1;
29 for(int i=1;i<M;i++)fac[i]=1LL*fac[i-1]*i%mod;
30 for(int i=2;i<N;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
31 for(int i=2;i<N;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
32 for(int i=1;i<M;i++)mi[i]=3LL*mi[i-1]%mod;
33 scanf("%d%d%d",&n,&m,&k);
34 for(int i=0;i<M;i++)rev[i]=(rev[i>>1]>>1)+((i&1)*(M>>1));
35 for(int i=1;i<M;i<<=1)
36 for(int j=0;j<i;j++)w[i+j]=cd(cos(j*PI/i),sin(j*PI/i));
37 for(int i=0;i<=m;i++)a1[i]=cd(inv[i]/K,0);
38 for(int i=0;i<=m;i++)a2[i]=cd(inv[i]%K,0);
39 for(int i=0;i<=k;i++)b1[i]=cd(inv[i]/K,0);
40 for(int i=0;i<=k;i++)b2[i]=cd(inv[i]%K,0);
41 fft(a1,0);
42 fft(a2,0);
43 fft(b1,0);
44 fft(b2,0);
45 for(int i=0;i<M;i++){
46 c1[i]=a1[i]*b1[i];
47 c2[i]=a1[i]*b2[i]+a2[i]*b1[i];
48 c3[i]=a2[i]*b2[i];
49 }
50 fft(c1,1);
51 fft(c2,1);
52 fft(c3,1);
53 for(int i=0;i<=m+k;i++){
54 int s1=llround(c1[i].real())%mod;
55 int s2=llround(c2[i].real())%mod;
56 int s3=llround(c3[i].real())%mod;
57 int s=(1LL*K*K%mod*s1+1LL*K*s2+s3)%mod;
58 ans=(ans+1LL*fac[n+i-1]*mi[m+k-i]%mod*s)%mod;
59 }
60 ans=1LL*ans*inv[n-1]%mod;
61 printf("%d",ans);
62 }
事实上还有更好的做法,由于$\frac{1}{i!(s-i)!}=\frac{{s\choose i}}{s!}$,代入即$\frac{\sum_{s=0}^{m+k}s!(n+s-1)!3^{m+k-s}\sum_{0\le i\le m,0\le s-i\le k}{s\choose i}}{(n-1)!}$
考虑后者,也就是$\sum_{i=l}^{r}{s\choose i}$,定义为$f(s,l,r)$,我们将这一行的每一个数乘以2(即有2个),在将非首尾的数利用杨辉三角合并,即$2f(s,l,r)=f(s,l+1,r)+{s\choose l}+{s\choose r}$
利用这个式子,注意到每一次$s$增加区间两端点变化为为$o(1)$,就可以线性的完成,复杂度为$o(n)$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define mod 1000000007
5 int n,m,k,ans,fac[N],inv[N],mi[N];
6 int c(int n,int m){
7 if (n<m)return 0;
8 return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
9 }
10 int main(){
11 fac[0]=inv[0]=inv[1]=mi[0]=1;
12 for(int i=1;i<N;i++)fac[i]=1LL*fac[i-1]*i%mod;
13 for(int i=2;i<N;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
14 for(int i=2;i<N;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
15 for(int i=1;i<N;i++)mi[i]=3LL*mi[i-1]%mod;
16 scanf("%d%d%d",&n,&m,&k);
17 //l=max(s-k,0),r=min(m,s)
18 int s=1,l=0,r=0;
19 for(int i=0;i<=m+k;i++){
20 if (i){
21 s=((2*s%mod+mod-c(i-1,l))%mod+mod-c(i-1,r))%mod;
22 l++;
23 while (max(i-k,0)<l)s=(s+c(i,--l))%mod;
24 while (l<max(i-k,0))s=(s+c(i,l++))%mod;
25 while (r<min(m,i))s=(s+c(i,++r))%mod;
26 while (min(m,i)<r)s=(s+c(i,r--))%mod;
27 }
28 ans=(ans+1LL*fac[n+i-1]*mi[m+k-i]%mod*s%mod*inv[i])%mod;
29 }
30 ans=1LL*ans*inv[n-1]%mod;
31 printf("%d",ans);
32 }
[atARC061F]Card Game for Three的更多相关文章
- Lesson 3 Please send me a card
Text Postcards always spoil my holidays. Last summer, I went to Italy. I visited museums and sat in ...
- iOS - Card Identification 银行卡号识别
1.CardIO 识别 框架 GitHub 下载地址 配置 1.把框架整个拉进自己的工程,然后在 TARGETS => Build Phases => Link Binary With L ...
- HDOJ 4336 Card Collector
容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Opensuse enable sound and mic card
Install application pavucontrol Run pavucontrol You will see the configuration about sound card and ...
- 进监狱全攻略之 Mifare1 Card 破解
补充新闻:程序员黑餐馆系统 给自己饭卡里充钱 ,技术是双刃剑,小心,小心! 前言 从M1卡的验证漏洞被发现到现今,破解设备层出不穷,所以快速傻瓜式一键破解不是本文的重点,年轻司机将从本文中获得如下技能 ...
- Card(bestcoder #26 B)
Card Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [OpenJudge 3061]Flip The Card
[OpenJudge 3061]Flip The Card 试题描述 There are N× Ncards, which form an N× Nmatrix. The cards can be p ...
- [杂谈]交通工具orca card
How and Where to Use the ORCA Card The Microsoft ORCA card provides unlimited rides on all buses, tr ...
- [OrangePi] Backup internal EMMC to SD Card
Boot your Orange PI board from EMMC without SD Card inserted login insert your SD Card Run: sudo ins ...
随机推荐
- WEB 标准以及 W3C 的理解与认识
01. WEB标准 ① web标准 简单来说可以分为结构.表现和行为. ② 结构:主要是有HTML标签组成(通俗点说,在页面body里面我们写入的标签都是为了页面的结构) 表现:即指css样 ...
- django3上线部署踩的坑
好久没有用过django写项目了,最近公司开发个官网,一时兴起就拿来练练手,这不用不知道,一用吓一跳啊. 才多久,版本都到3.0了. 踩坑一:运行项目时失败报错,后来查找资料发现, 当你使用djang ...
- 使用 z3 进行逆向 解密字符串
在逆向过程中,我们知道了一个结果值,和一段计算代码.这个时候我们需要知道计算前的值是什么:需要用到 z3 模块来进行解题 z3项目地址 Java代码如下: private String b(Strin ...
- pycharm运行测试程序提示no tests were found
转载: https://blog.csdn.net/qq_33834328/article/details/75095078
- RabbitMQ设计原理解析
背景 RabbitMQ现在用的也比较多,但是没有过去那么多啦.现在很多的流行或者常用技术或者思路都是从过去的思路中演变而来的.了解一些过去的技术,对有些人来说可能会产生众里寻他千百度的顿悟,加深对技术 ...
- UltraSoft - Beta - 发布声明
1. Beta版本更新内容 新功能 (1)消息中心页面 课程爬取到新DDL.资源时会以通知的方式通知用户,本次同步更新了哪些内容一目了然.此外,当被作为参与成员添加DDL时也会通知.一些系统通知也会放 ...
- 第4次 Beta Scrum Meeting
本次会议为Beta阶段第4次Scrum Meeting会议 会议概要 会议时间:2021年6月4日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下一 ...
- the Agiles Scrum Meeting 6
会议时间:2020.4.14 20:00 1.每个人的工作 今天已完成的工作 增量组:开发广播正文展开收起功能 issues:增量组:广播正文展开收起功能实现 完善组:修复冲刺部分的bug issue ...
- 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)
背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...