Codeforces 722E [DP]

来源:互联网 发布:潍坊网络推广招聘 编辑:程序博客网 时间:2024/05/20 17:39

Solution

以前做过一道题是这样的

  • 给定nm的网格图和k个点,求不定过某些点从(1,1)走到(n,m)的方案数。

这个的话直接O(k2)DP就好了。
这道题也差不多,因为电池的衰减只有O(log2s)种,所以DP时记录一下当前经过的点的个数就好了。

#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int N = 101010;const int M = 2020;const int MOD = 1000000007;typedef long long ll;inline char get(void) {    static char buf[100000], *S = buf, *T = buf;    if (S == T) {        T = (S = buf) + fread(buf, 1, 100000, stdin);        if (S == T) return EOF;    }    return *S++;}inline void read(int &x) {    static char c; x = 0;    for (c = get(); c < '0' || c > '9'; c = get());    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';}int n, m, k, s, lim, ans;struct Point {    int x, y;    Point (int _x = 0, int _y = 0):x(_x), y(_y) {}    inline friend bool operator <(const Point &a, const Point &b) {        return a.x == b.x ? a.y < b.y : a.x < b.x;    }};Point a[M];int fac[N << 1], inv[N << 1];int dp[N][100];inline int Pow(int a, int b) {    int c = 1;    while (b) {        if (b & 1) c = (ll)c * a % MOD;        b >>= 1; a = (ll)a * a % MOD;    }    return c;}inline int Inv(int x) {    return Pow(x, MOD - 2);}inline int C(int n, int m) {    return (ll)fac[n] * inv[m] % MOD * inv[n - m] % MOD;}inline int Calc(int n, int m) {    return C(n + m, n);}int main(void) {    read(n); read(m); read(k); read(s);    inv[1] = 1; lim = 25;    for (int i = 2; i <= 200000; i++)        inv[i] = (ll)(MOD - MOD / i) * inv[MOD % i] % MOD;    fac[0] = inv[0] = 1;    for (int i = 1; i <= 200000; i++) {        fac[i] = (ll)fac[i - 1] * i % MOD;        inv[i] = (ll)inv[i - 1] * inv[i] % MOD;    }    for (int i = 1; i <= k; i++) {        read(a[i].x); read(a[i].y);    }    sort(a + 1, a + k + 1);    if (a[k].x == n && a[k].y == m) s -= s / 2;    else a[++k] = Point(n, m);    if (a[1].x != 1 || a[1].y != 1) {        s *= 2; a[++k] = Point(1, 1);    }    sort(a + 1, a + k + 1);    dp[1][0] = 1;    for (int i = 2; i <= k; i++) {        dp[i][1] = Calc(a[i].x - 1, a[i].y - 1);        for (int d = 2; d <= lim; d++) {            for (int j = 1; j < i; j++) {                if (a[j].y > a[i].y) continue;                dp[i][d] += (ll)dp[j][d - 1] * Calc(a[i].x - a[j].x, a[i].y - a[j].y) % MOD;                dp[i][d] -= (ll)dp[j][d] * Calc(a[i].x - a[j].x, a[i].y - a[j].y) % MOD;                dp[i][d] = (dp[i][d] % MOD + MOD) % MOD;            }        }    }    ans = 0;    for (int i = 1; i <= lim; i++) {        s -= s / 2;        ans = ans + (ll)(dp[k][i] - dp[k][i + 1] + MOD) * s % MOD;        ans %= MOD;    }    cout << (ll)ans * Inv(Calc(n - 1, m - 1)) % MOD << endl;    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 4岁宝宝感冒发烧怎么办 6个月宝宝流鼻涕怎么办 8岁儿童感冒发烧怎么办 婴儿感冒咳嗽怎么办%3f 小孩流鼻涕鼻塞怎么办最简单方法 宝宝鼻炎鼻子不通气怎么办 小孩晚上睡觉鼻子不通气怎么办 孩子晚上睡觉鼻子不通气怎么办 3个月婴儿流鼻涕怎么办 一个月宝宝鼻塞流鼻涕怎么办 我的鼻子不通气怎么办 鼻子擦多了疼怎么办 鼻涕擦多了好疼怎么办 鼻炎一直流鼻水怎么办 擤鼻涕后耳朵堵怎么办 鼻涕醒多了头疼怎么办 感冒鼻子破皮了怎么办 感冒鼻子擦红了怎么办 擤鼻涕时耳朵疼怎么办 鼻涕进耳朵里了怎么办 怀孕6个月生病了怎么办 浓鼻涕擤不出来怎么办 有鼻涕在鼻腔里怎么办 感冒鼻子擤的疼怎么办 擤鼻涕耳膜破了怎么办 钢铁雄心4闪退怎么办 钢铁雄心4太卡怎么办 无主之地2卡怎么办 卡盟给骗了怎么办 玩偶吸盘不吸了怎么办 买的吸盘吸不住怎么办 苹果6gps信号弱怎么办 魅蓝gps信号弱怎么办 小天才手表丢了怎么办 小天才2代进水了怎么办 ck的后盖上不了怎么办 冬天车玻璃有霜怎么办 热水管头坏了怎么办 注塑机螺杆包胶怎么办 造粒螺杆粘料怎么办 xp开机密码忘了怎么办