zoukankan      html  css  js  c++  java
  • P2182 翻硬币

    题目描述

    小Z离开家的时候忘记带走了钱包,掉下的硬币在桌子上排成了一列。正在等着哥哥回来的小D坐在桌子旁边,无聊地翻着桌子上的硬币。

    出于某种爱好,小D一次一定会同时翻转 M 枚硬币。由于小D是一个爱动脑的小学生,这样进行了若干次之后她很快想到了一个问题:有多少种方法能够在 K 次翻转后把硬币由原来的状态变成现在这样呢?

    因为小D是个好学的小学生,她只需要你告诉她方案数对 1000000007 取模的值以方便她进行验算就可以了。

    输入输出格式

    输入格式:

    第一行,包含三个字符 N,K,M ,表示硬币的数量,翻转的次数和每次翻转的硬币数量。

    第 2~3 行,包含 N 个字母,表示硬币在一开始的状态和最终要变成的状态。1 表示正面而 0 表示背面。

    输出格式:

    一行包含一个整数,表示方案数对 1000000007 取模的值。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k,tot;
    int mod=1000000007;
    long long int c[1321][2132],f[2312][23123];
    char a[300],b[300];
    int work(){
        cin>>n>>k>>m;
        scanf("%s%s",a+1,b+1);
        for(int i=1;i<=n;i++)if(a[i]!=b[i])tot++;
        return tot;
    }
    int main()
    {
        c[0][0]=1;
        for(int i=1;i<=100;i++){
            c[i][0]=1;
            for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
        }
        f[0][work()]=1;
        for(int t=1;t<=k;t++)
        for(int i=0;i<=n;i++)
        for(int j=0;j<=min(i,m);j++)
        {
            int ta=i-2*j+m;
        if(ta>=0&&ta<=n)
        f[t][ta]=(f[t][ta]%mod+f[t-1][i]*(c[n-i][m-j]*c[i][j]%mod)%mod)%mod;
        }
        cout<<f[k][0];
    }
  • 相关阅读:
    [CSP-S模拟测试]:F(DP+线段树)
    [CSP-S模拟测试]:E(贪心)
    [CSP-S模拟测试]:D(暴力+剪枝)
    [CSP-S模拟测试]:C(三分+贪心)
    [CSP-S模拟测试]:B(DP+数学)
    [CSP-S模拟测试]:A(数学)
    [CSP-S模拟测试]:密码(数位DP+库默尔定理)
    BZOJ3456 城市规划 【多项式求逆】
    多项式求逆
    uoj185 [ZJOI2016]小星星 【dp + 容斥】
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10887269.html
Copyright © 2011-2022 走看看