题目:https://loj.ac/problem/2304

看了各种题解……

\( dp[i][j] \) 表示有 i 列、第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大合法矩形面积 <= lm。其中第 j 行及以下的部分的贡献是 1 而不是 q 的几次方。

那么有 \( dp[i][j]=dp[i][j+1]*p^i + \sum\limits_{k=1}^{i}dp[k-1][j+1]*p^{k-1}*(1-p)*dp[i-k][j] \)

注意到当 i>k 的时候,最底下一行必然有至少一个位置是非法的。所以令 \(ans_i\) 表示 i 列的概率,有 \( ans_i = \sum\limits_{j=1}^{i}ans_{j-1}*(1-p)*dp[i-j][1]*p^{i-j} \)

\(ans_i\) 的初值就是 dp[i][0] 。注意 dp[0][*]=1 。然后可以用常系数线性齐次递推的知识优化。

注意清空数组。注意别把 n 的值真的改掉。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=N<<,mod=;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} int n,q,q2,f[N][N],bin[N],a[N],ans[M],b[M],c[M],lm;
void Mul(int *u,int *v)//(lm-1)'
{
memset(c,,sizeof c);
for(int i=;i<lm;i++)
for(int j=;j<lm;j++)
c[i+j]=(c[i+j]+(ll)u[i]*v[j])%mod; for(int i=*(lm-);i>=lm;i--)
if(c[i])
for(int j=;j<=lm;j++)
c[i-j]=(c[i-j]+(ll)c[i]*a[j])%mod;
memcpy(u,c,sizeof *lm);//0~lm-1
}
int solve(int tmp)
{
lm=tmp; memset(f,,sizeof f);
for(int j=;j<=lm+;j++)f[][j]=;//lm+1 not lm!!!
for(int i=;i<=lm;i++)
for(int j=lm/i;j>=;j--)
{
int tp=(ll)f[i][j+]*bin[i]%mod;
for(int k=;k<=i;k++)
{
int ml=(ll)f[k-][j+]*f[i-k][j]%mod;
ml=(ll)ml*q2%mod*bin[k-]%mod;
tp=upt(tp+ml);
}
f[i][j]=tp;
}
if(n<=lm)return f[n][]; lm++; for(int i=;i<=lm;i++)
{
int tp=(ll)f[i-][]*bin[i-]%mod;
a[i]=(ll)tp*q2%mod;//not lm-i
}
memset(ans,,sizeof ans);////
memset(b,,sizeof b);////
ans[]=b[]=; int tn=n;//////
while(tn)
{
if(tn&)Mul(ans,b); Mul(b,b); tn>>=;
}
int ret=;
for(int i=;i<lm;i++)
ret=(ret+(ll)ans[i]*f[i][])%mod;
return ret;
}
int main()
{
int x,y,k;scanf("%d%d%d%d",&n,&k,&x,&y);
q=(ll)x*pw(y,mod-)%mod; q2=upt(-q);
bin[]=;
for(int i=;i<=k;i++)bin[i]=(ll)bin[i-]*q%mod;
printf("%d\n",upt(solve(k)-solve(k-)));
return ;
}

LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推的更多相关文章

  1. LOJ#2304. 「NOI2017」泳池

    $n \leq 1e9$底边长的泳池,好懒啊泥萌自己看题吧,$k \leq 1000$.答案对998244353取膜. 现在令$P$为安全,$Q$为危险的概率.刚好$K$是极其不好算的,于是来算$\l ...

  2. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

  3. 【BZOJ4944】[NOI2017]泳池(线性常系数齐次递推,动态规划)

    [BZOJ4944][NOI2017]泳池(线性常系数齐次递推,动态规划) 首先恰好为\(k\)很不好算,变为至少或者至多计算然后考虑容斥. 如果是至少的话,我们依然很难处理最大面积这个东西.所以考虑 ...

  4. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  5. 「NOI2017」泳池

    DP式子比后面的东西难推多了 LOJ2304 Luogu P3824 UOJ #316 题意 给定一个长度为$ n$高为$ \infty$的矩形 每个点有$ 1-P$的概率不可被选择 求最大的和底边重 ...

  6. 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模

    题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...

  7. LOJ 6435 「PKUSC2018」星际穿越——DP+倍增 / 思路+主席树

    题目:https://loj.ac/problem/6435 题解:https://www.cnblogs.com/HocRiser/p/9166459.html 自己要怎样才能想到怎么做呢…… dp ...

  8. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  9. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

随机推荐

  1. DataFrame API应用案例

    DataFrame API 1.collect与collectAsList . collect返回一个数组,包含DataFrame中的全部Rows collectAsList返回一个Java List ...

  2. Mongodb php扩展及安装

                            Mongodb php扩展 Mongodb安装 1: 下载mongodb www.mongodb.org 下载最新的stable版 2: 解压文件 3: ...

  3. 16/7/14-MySQL-遇到的基本问题

    从一开始遇到的3534 ---------------------------------------------------------------------------------------- ...

  4. Vue事件总线

    一 项目结构 二 main.js import Vue from "vue"; import App from "./App.vue"; import Tool ...

  5. python实现获取文件夹中的最新文件

    实现代码如下: #查找某目录中的最新文件import osclass FindNewFile: def find_NewFile(self,path): #获取文件夹中的所有文件 lists = os ...

  6. SQLMap使用总结

    支持模式:布尔/时间/报错/联合查询/堆查询 支持数据库:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM ...

  7. Entity Framework 中遇到的一些小问题

    一.在多表关联中,一个表中有另一个表的model累,在Include方法里提示lambda表达式不是委托类型,这时候需要using System.Data.Entity; 二.插入数据时,主键并非自增 ...

  8. 关于JSON.stringify()与JSON.parse()

    一.JSON.stringify()与JSON.parse()的区别 JSON.stringify()的作用是将js值转换成JSON字符串,而JSON.parse()是将JSON字符串转换成一个对象. ...

  9. Python_pickle

    pickle是一个可以将任意一个对象存储在硬盘文件中的工具. 更新:Python3中用法变了:  https://www.cnblogs.com/fmgao-technology/p/9078918. ...

  10. JVM(12)之 可视化分析工具

    开发十年,就只剩下这套架构体系了! >>>   经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工 ...