题意:有一个n * m的棋盘,你初始在点(1, 1),你需要去点(n, m)。你初始有s分,在这个棋盘上有k个点,经过一次这个点分数就会变为s / 2(向上取整),问从起点到终点的分数的数学期望是多少?

思路:按照套路,先把这k个点按照pair的方式进行排序,设dp[i][j]为从起点到点i之前经过了至少j个减分点,到点i的数学期望。那么所有在它之前的可以向它转移的点向它转移。那么dp[i][j] = Σ(dp[u][j - 1] - dp[u][j]) * g(u, i)。其中g(u, i)是u, i之间没有限制条件的走法数目,用组合数学的方法计算即可。这样相当于是前面恰好走过j个点 + 可能走过大于一个点的方式转移过来,这样可以保证计数的不重不漏。

代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define db double
#define LL long long
#define pii pair<int, int>
using namespace std;
const int maxn = 200010;
const LL mod = 1e9 + 7;
LL dp[2010][40];
pii a[2010];
LL v[maxn], inv[maxn];
LL qpow(LL x, LL y) {
LL ans = 1;
for (; y; y >>= 1) {
if(y & 1) ans = (ans * x) % mod;
x = (x * x) % mod;
}
return ans;
}
void init(int n) {
v[0] = 1;
for (int i = 1; i <= n; i++) {
v[i] = (v[i - 1] * i) % mod;
}
inv[n] = qpow(v[n], mod - 2);
for (int i = n - 1; i >= 0; i--) {
inv[i] = (inv[i + 1] * (i + 1)) % mod;
}
}
LL C(LL n, LL m) {
return (((v[n] * inv[m]) % mod) * inv[n - m]) % mod;
}
LL cal(int x, int y) {
LL tmp = abs(a[y].first - a[x].first), tmp1 = tmp + (a[y].second - a[x].second);
return C(tmp1, tmp);
}
LL b[50];
int main() {
int n, m, k, t;
scanf("%d%d%d%d", &n, &m, &k, &t);
init(n + m);
for (int i = 1; i <= k; i++) {
scanf("%d%d", &a[i].first, &a[i].second);
}
int lim = 0;
while(t > 1) {
b[++lim] = t;
t = (t + 1) / 2;
}
b[++lim] = 1;
b[lim + 1] = 1;
sort(a + 1, a + 1 + k);
k++;
a[k] = make_pair(n, m);
for (int i = 1; i <= k; i++) {
dp[i][0] = C(a[i].first + a[i].second - 2, a[i].first - 1);
}
LL ans = 0;
for (int j = 1; j <= lim; j++) {
for (int i = 1; i <= k; i++) {
for (int t = 1; t < i; t++) {
if(a[t].first <= a[i].first && a[t].second <= a[i].second) {
LL tmp1 = (dp[t][j - 1] - dp[t][j] + mod) % mod;
LL tmp2 = cal(t, i);
assert(tmp1 >= 0);
assert(tmp2 >= 0);
dp[i][j] += (tmp1 * tmp2) % mod;
dp[i][j] %= mod;
}
}
}
}
for (int i = 0; i <= lim; i++) {
ans = (ans + (((dp[k][i] - dp[k][i + 1] + mod) % mod) * b[i + 1]) % mod) % mod;
}
ans = (ans * qpow(C(n + m - 2, n - 1), mod - 2)) % mod;
printf("%lld\n", ans);
}

  

Codeforces 722E 组合数学 DP的更多相关文章

  1. codeforces 1194F (组合数学)

    Codeforces 11194F (组合数学) 传送门:https://codeforces.com/contest/1194/problem/F 题意: 你有n个事件,你需要按照1~n的顺序完成这 ...

  2. codeforces 722E Research Rover

    codeforces 722E Research Rover 题意 \(1e5*1e5\)的棋盘中有\(2000\)个坏点,初始给定一个值\(s(1<=s<=1e6)\).从棋盘左上角走到 ...

  3. 【uoj#22】[UR #1]外星人 组合数学+dp

    题目描述 给你一个长度为 $n$ 的序列 $\{a_i\}$ 和一个数 $x$ ,对于任意一个 $1\sim n$ 的排列 $\{p_i\}$ ,从 $1$ 到 $n$ 依次执行 $x=x\ \tex ...

  4. 【bzoj1925】[Sdoi2010]地精部落 组合数学+dp

    题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到 ...

  5. Codeforces Gym 100338H High Speed Trains 组合数学+dp+高精度

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  6. D - Yet Another Problem On a Subsequence CodeForces - 1000D (DP,组合数学)

    D - Yet Another Problem On a Subsequence CodeForces - 1000D The sequence of integers a1,a2,-,aka1,a2 ...

  7. codeforces 659 G. Fence Divercity 组合数学 dp

    http://codeforces.com/problemset/problem/659/G 思路: f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数 递推看代 ...

  8. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...

  9. codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】

    C. The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input s ...

随机推荐

  1. Python---基础-小游戏用户猜数字

    一.10 < cost < 50 的等价表达式 cost = 40 10 < cost < 50 (10 < cost) and (cost < 50) 二.使用i ...

  2. 030:spaceless和autoescape 标签

    1.spaceless 标签: spaceless 标签:移除html标签中的空白字符.包括空格.tab键.换行等.示例代码如下: {% spaceless %} <p> <a hr ...

  3. iOS----收集的一些小技巧

    1,如何将试图置于最顶层 第一种方法 _myview.layer.zPosition =5; 第二种方法 [self.view insertSubview:_MyView atIndex:999]; ...

  4. 数组与List互转的坑

    一.数组转List 非原始类型的数组转List有很多种方式:假设有Integer[] arr = {"a", "b", "c"}; 1.Li ...

  5. Word文档粘贴到DEDECMS

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  6. windows 系统再重启后,USB口失效(鼠标、U盘都无法识别)的过程及解决方法

    今天都差点忘记写随笔.今天在工作中,将电脑重启了一次,悲催了.重启完成后,鼠标无法使用了.最初认为 鼠标的问题,就一直"砸",但后来换了鼠标,仍然不能使用,开始认为没这边简单,拿出 ...

  7. linux之rpm软件包管理

    1.RPM包的命名规则 例如:httpd-2.2.15-15.el6.centos.1.i686.rpm httpd ·        软件包名 2.2.15        软件版本 15       ...

  8. Ntdll.h

    转自:https://www.cnblogs.com/gwsbhqt/p/5092390.html 为了能使用上Ntdll.lib库函数,从几份不完整的Ntdll.h中拼凑整理出了比较完整美观的Ntd ...

  9. 疑难杂症——解决 Cinder 僵尸卷问题

    目录 目录 问题描述 问题解决 最后 问题描述 Cinder 的僵尸卷一般是因为操作不当导致分配的卷无法正常使用且无法正常分离或删除. 问题解决 解决僵尸卷问题的思路类似解决 Linux 系统中的僵尸 ...

  10. CSS学习笔记1:字体样式属性

    CSS初识 成叠样式表,主要用于设置html页面的外观 产生原因:为了解决混乱的结构和样式,使结构和样式相分离. CSS注释 /*这是CSS注释*/ CSS样式规则 1.选择器用于指定css样式作用的 ...