Codeforces708E Student's Camp
Description
有一个 的网格。
除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有 的概率消失。
求 天后,网格始终保持连通的概率。
,,答案对 取模。
Solution
先计算 表示经过 天后在单个方向有 个格子消失的概率
那么设 表示第 行剩下 且保证连通到第一行的概率,转移找上一行有交的就行了
设 表示第 行右端点不超过 的所有区间 值之和, 表示左端点不小于 的区间 值之和
由于矩形是对称的,那么
单个元素转移复杂度难以下降,同时对每个元素各自进行观察除了对称什么也得不到,所以只能尝试摸索前缀和转移是否可行
将单个元素转移式对两侧第二维求和得到
其中 表示第 行所有元素的 值求和的结果,拆开分别做前缀和即可
时间复杂度
Code
const int N=2010;
int n,p,c[N],d[N][N],dp[N];
signed main(){
n=read();
int a=read(),b=read();
p=mul(a,ksm(b,mod-2));
d[1][0]=d[1][1]=1;
for(int i=2;i<=n;i++){
d[i][0]=1;
for(int j=1;j<=i;j++)
d[i][j]=(d[i-1][j]*ksm(mod+1-p,j)+d[i-1][j-1]*ksm(p,i-j))%mod;
}
for(int i=1;i<=n;i++){
int res=0;
for(int j=1;j<i;j++) ckadd(res,mul(c[j],d[i][j]));
c[i]=del(1,res);
}
for(int i=1;i<=n;i++){
int res=0;
for(int j=1;j<i;j++){
int tmp=(dp[j]+j*(i-j)+dp[i-j]+j*(j-1)/2)%mod;
res=(res+c[j]*d[i][j]%mod*tmp)%mod;
}
res=(res+c[i]*d[i][i]%mod*(i*(i-1)/2))%mod;
dp[i]=res*ksm(mod+1-c[i]*d[i][i]%mod,mod-2)%mod;
}
print(dp[n]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律