• Codeforces Round #568 (Div. 2) G2. Playlist for Polycarp (hard version)


    因为不会打公式,随意就先将就一下?

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    using namespace std;
    typedef long long LL;
    const int N=55;
    const int MOD=1e9+7;
    int add (int x,int y)   {x=x+y;return x>=MOD?x-MOD:x;}
    int mul (int x,int y)   {return (LL)x*y%MOD;}
    int dec (int x,int y)   {x=x-y;return x<0?x+MOD:x;}
    int Pow (int x,int y)
    {
        if (y==0) return 1;
        if (y==1) return x;
        int lalal=Pow(x,y>>1);
        lalal=mul(lalal,lalal);
        if (y&1) lalal=mul(lalal,x);
        return lalal;
    }
    int n,m;
    int g[N][N][N][4];
    int h[N][N][N];
    int JC[N];
    void Init (int n)
    {
        memset(g,0,sizeof(g));
        g[0][0][1][2]=1;g[0][1][0][1]=1;g[1][0][0][0]=1;
        JC[0]=1;for (int u=1;u<=n;u++) JC[u]=mul(JC[u-1],u);
        for (int u=0;u<=n;u++)
        for (int i=0;i<=n;i++)
        for (int j=0;j<=n;j++) 
        for (int k=0;k<=2;k++)    if (g[u][i][j][k])
        {
            if (k!=0) g[u+1][i][j][0]=add(g[u+1][i][j][0],g[u][i][j][k]);
            if (k!=1) g[u][i+1][j][1]=add(g[u][i+1][j][1],g[u][i][j][k]);
            if (k!=2) g[u][i][j+1][2]=add(g[u][i][j+1][2],g[u][i][j][k]);
            int now=mul(mul(mul(JC[u],JC[i]),JC[j]),g[u][i][j][k]);
            //if (u==2&&i==1&&j==0) printf("%d %d
    ",g[u][i][j][k],(mul(JC[u],JC[i]),JC[j]));
            h[u][i][j]=add(h[u][i][j],now);
        }
        //printf("%d
    ",h[2][1][0]);
    }
    vector<int> vec[N];
    int f[3][N][2505];
    int sum[3];
    int d[N][N][2505];
    int main()
    {
        Init(50);
        scanf("%d%d",&n,&m);
        for (int u=1;u<=n;u++)
        {
            int t,g;
            scanf("%d%d",&t,&g);
            sum[g-1]+=t;vec[g-1].push_back(t);
        }
        if (sum[0]>sum[2])    {swap(sum[0],sum[2]);swap(vec[0],vec[2]);}
        if (sum[1]>sum[2])    {swap(sum[1],sum[2]);swap(vec[1],vec[2]);}
        for (int u=0;u<=2;u++)
        {
            int siz=vec[u].size();
            f[u][0][0]=1;
            for (int i=0;i<siz;i++)
            for (int j=i+1;j>=1;j--)
            for (int k=sum[u];k>=vec[u][i];k--)
            f[u][j][k]=add(f[u][j][k],f[u][j-1][k-vec[u][i]]);
        }
        for (int u=0;u<=vec[0].size();u++)
        for (int j=0;j<=sum[0];j++) if (f[0][u][j])
        for (int i=0;i<=vec[1].size();i++)
        for (int k=0;k<=sum[1];k++) if (f[1][i][k])
        d[u][i][j+k]=add(d[u][i][j+k],mul(f[0][u][j],f[1][i][k]));
        int ans=0;
        for (int u=0;u<=vec[2].size();u++)
        for (int i=0;i<=sum[2];i++) if (f[2][u][i])
        {
            int t=m-i;
            for (int j=0;j<=vec[0].size();j++)
            for (int k=0;k<=vec[1].size();k++)
            ans=add(ans,mul(h[u][j][k],(mul(d[j][k][t],f[2][u][i]))));
        }
        printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    BZOJ 1013--[JSOI2008]球形空间产生器sphere(高斯消元)
    BZOJ 1012--[JSOI2008]最大数maxnumber(二分&单调栈)
    BZOJ 3357--[Usaco2004]等差数列(STL&DP)
    BZOJ 1011--[HNOI2008]遥远的行星(乱搞)
    BZOJ 1010--[HNOI2008]玩具装箱toy(斜率优化dp)
    BZOJ 5334--[Tjoi2018]数学计算(线段树)
    BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)
    BZOJ 1008--[HNOI2008]越狱(容斥&快速幂)
    一个典型的装饰器
    Nginx 配置文件详解
  • 原文地址:https://www.cnblogs.com/Als123/p/11061147.html
Copyright © 2020-2023  润新知