CF908D New Year and Arbitrary Arrangement

LXII.CF908D New Year and Arbitrary Arrangement

思路:

期望题果然还是恶心呀……

我们设f[i][j]表示当串中有iajab时的方案数。为了方便,设A=PaPa+Pb,B=PbPa+Pb

显然,可以这样转移:

f[i][j]=f[i+1][j]A+f[i][i+j]B

因为,如果串后面加上一个a,概率是A,并且加完后唯一的影响就是i+1;如果加入一个b,概率是B,加完后前面每一个a都会与这个b形成一对ab

那么边界条件呢?

显然,当i+jk时,只要再往后面加入一个b,过程就停止了。

则这个的期望长度应该是:

Ba=0(i+j+a)Aa

其中,枚举的这个a是在终于搞出一个b前,所刷出的a的数量。

为了方便,我们设i+j=c,并用i替换a。即:

Bi=0(c+i)Ai

因为A+B=1,我们可以用(1A)B

即:

(1A)i=0(c+i)Ai

拆开括号得

i=0(c+i)Aii=0(c+i)Ai+1

一上来直接有些不直观,我们用n替换掉。

i=0n(c+i)Aii=0n(c+i)Ai+1

在第二个式子里面用i+1代掉i

i=0n(c+i)Aii=1n+1(c+i1)Ai

将第一个Σi=0的情况和第二个Σi=n+1的情况分别提出

c+i=1n(c+i)Aii=1n(c+i1)Ai(c+n)An+1

合并两个Σ

c+i=1nAi(c+n)An+1

套等比数列求和公式(注意要先提出一个A使首项为1

c+A1An1A(c+n)An+1

注意到1A=B

c+A1AnB(c+n)An+1

现在,考虑n的情况。即:

limnc+A1AnB(c+n)An+1

注意到0<A<1,因此limnAn=0

带入发现

c+A10B(c+n)0

处理一下

c+AB

注意到我们一开始的定义了吗?

A=PaPa+Pb,B=PbPa+Pb

以及c=i+j

代入得

i+j+PaPb

也就是说,边界条件就是f[i][j]=i+j+PaPb(i+jk)!!!

再搬出我们一开始的转移式

f[i][j]=f[i+1][j]A+f[i][i+j]B

完事。

哦,另外,还要思考一下答案到底是f[0][0]还是f[1][0]

因为一开始的那些b,无论来多少个都是没用的,因此不如直接从f[1][0]开始。(事实上,你如果把转移式代回去或者打个表的话,你会发现就有f[0][0]=f[1][0]

复杂度O(k2+logmod)

代码:

#include<bits/stdc++.h>
using namespace std;
int n,a,b,A,B,f[1010][1010],c;
const int mod=1e9+7;
int ksm(int x,int y){
    int z=1;
    for(;y;x=(1ll*x*x)%mod,y>>=1)if(y&1)z=(1ll*z*x)%mod;
    return z;
}
int dfs(int x,int y){
    if(x+y>=n)return x+y+c;
    if(f[x][y]!=-1)return f[x][y];
    int &res=f[x][y];res=0;
    (res+=1ll*dfs(x+1,y)*A%mod)%=mod;
    (res+=1ll*dfs(x,x+y)*B%mod)%=mod;
    return res;
}
int main(){
    scanf("%d%d%d",&n,&a,&b),A=1ll*a*ksm(a+b,mod-2)%mod,B=1ll*b*ksm(a+b,mod-2)%mod,c=1ll*a*ksm(b,mod-2)%mod,memset(f,-1,sizeof(f));
    printf("%d\n",dfs(1,0));
    return 0;
}

posted @   Troverld  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示