cf 553A dp+组合数学

来源:互联网 发布:sqlalchemy 原生sql 编辑:程序博客网 时间:2024/05/29 13:08

题意:
有K中颜色去涂球,第i中颜色要涂ci个球,不能位置的球颜色相同是有区别的,涂完第i种球的时候前i-1种球必须先涂完,问总共有多少种涂法

分析:
一开始想按涂球的数量递推,然后发现是不行的,复杂度太大
这题怎么想呢,按已涂的颜色数量来递推。
怎么想呢?
假设我们已经涂了前i-1种颜色的球,并且种类为dp[i-1],并且前i-1中颜色的球的总数是presum,这个时候我们要涂第i中颜色的ci个球,这就相当于把ci-1个球插入到presum个球中间去,并且把最后一个放到最后,那么dp[i] = dp[i-1] * C(ci-1+presum,ci-1)

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const long long MOD = 1000000007;long long f[1100], fe[1100];long long dp[1100];int K, num[1100];long long getf( long long x ){    long long ans = 1, temp = MOD - 2;    while( temp ){        if( temp & 1 ){            ans = ans * x % MOD;        }        x = x * x % MOD;        temp /= 2;    }    return ans;}void init(){    f[0] = f[1] = 1;    fe[0] = fe[1] = 1;    for( int i = 2; i <= 1000; i++ ){        f[i] = f[i-1] * i % MOD;        fe[i] = fe[i-1] * getf( i ) % MOD;    }}int main(){    init();    scanf( "%d", &K );    for( int i = 0; i < K; i++ ){        scanf( "%d", &num[i] );    }    dp[0] = 1;    int presum = num[0];    for( int i = 1; i < K; i++ ){        dp[i] = dp[i-1] * f[presum + num[i]-1] % MOD * fe[num[i]-1] % MOD * fe[presum] % MOD;        presum += num[i];    }    printf( "%I64d\n", dp[K-1] );    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 过了麦季身上老痒怎么办 过麦时候皮肤痒怎么办 颈部起红疙瘩痒怎么办 脚底痒身上痒该怎么办 生完孩子屁股疼怎么办 pr打开工程文件无响应怎么办 娃娃和老师有隔阂了怎么办 大人字写得不好怎么办 不会写好看的字怎么办 无限量流量限速了怎么办 长期化妆后皮肤变黄怎么办 手机密码忘记了打不开怎么办 手机解压包不知道密码怎么办 手机屏图标没了怎么办 b站页面卡顿怎么办 被全景视觉骗了怎么办? 逆战进去没声音怎么办 Mac电脑ai卡住了怎么办 pr字幕打不了字怎么办 pr手写字多笔画怎么办 家中挖矿噪音很大怎么办 学了栏目包装不想干怎么办 在文本打字乱了怎么办 体考后觉得成绩有出入怎么办 荧光棒进眼睛里怎么办 无法读源文件或磁盘怎么办 爱剪辑视频横着怎么办 pr界面字体太小怎么办 0p手机卡槽坏了怎么办 pr视频有水波纹怎么办 手机耳机插口插上没声音怎么办 xp系统电脑没有声音怎么办 win10笔记本耳机没声音怎么办 电脑插耳机还是外放怎么办 主机电脑耳机插孔坏了怎么办 苹果6plus有点卡怎么办 手机拨通电话后黑屏怎么办 手机拨通后没声音怎么办 苹果手机铃声不响了怎么办 婴儿喘气粗好像有痰怎么办 金毛呼吸声很大怎么办