【NOIP2013模拟】粉刷匠

原创 2016年05月30日 19:37:33

Description

给出n个球,其中有C1个球是颜色1的,有C2个球是颜色2的,有C3个球是颜色3的……
有Ck个球是颜色k的。求相邻两个球颜色不同的排列方案。
k<=15,ci<=6,数据组数<=2000

Solution

这种题一般很难有直接的通式,可以考虑Dp。
设Fi,j表示,前i中颜色已经放完了,其中产生了j个不合法的空的方案数。(这里的空指的是每两个球中间的位置,包括开头结尾,不合法即指两边的球的颜色相同)
我们再枚举一个p和q,表示这种颜色要放到p个合法空和q个不合法空。
那么新的j呢?
因为我们放入了q个不合法空,所以j会减去q,然后,总共有C[i+1]个球,在p+q个空中各放了一个后,剩下的无论怎么放都会产生一个不合法空,所以加上C[i+1]-p-q
即:F[i,j]->F[i+1,j+C[i+1]-p-q]
然后如何转移,首先,我们要把C[i+1]个球放到p+q个空中,每个空都必须要放,所以有Cp+q1C[i+1]1种方法放,然后,在现有的j个空中选q个,乘上Cqj,设总共有sum个空,再乘上Cpsumj
然后这道题就解决了。
Ps:由于比赛时特别方,我疯狂滴优化常数,打得非常的渣渣。

Code

#include<cstdio>
#include<cstring>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define mo 1000000007
#define N 105
using namespace std;
typedef long long ll;
int n,ty,x,c[N][N],f[20][N];
int min(int x,int y) {if (x<y) return x;else return y;}
int get() {
    char ch;
    while (!isdigit(ch=getchar()));int o=ch-48;
    while (isdigit(ch=getchar())) o=o*10+ch-48;
    return o;
}
int main() {
    c[0][0]=1;
    fo(i,1,95) {
        c[i][0]=1;
        fo(j,1,i) {
            c[i][j]=c[i-1][j]+c[i-1][j-1];
            c[i][j]-=c[i][j]/mo*mo;
        }
    } 
    for(ty=get();ty;ty--) {
        n=get();f[0][0]=1;int sum=0;
        fo(i,1,n) {
            x=get();fo(j,0,sum+x+1) f[i][j]=0;
            fo(j,0,sum) 
                fo(k,0,min(j,x))
                    fo(l,0,min(x-k,sum+1-j)) {
                        if (!(k+l)) continue;
                        int ans=f[i-1][j];int y=j+x-2*k-l;
                        ans=(ll)ans*c[x-1][k+l-1]-(ll)ans*c[x-1][k+l-1]/mo*mo;
                        ans=(ll)ans*c[j][k]-(ll)ans*c[j][k]/mo*mo;
                        ans=(ll)ans*c[sum+1-j][l]-(ll)ans*c[sum+1-j][l]/mo*mo;
                        f[i][y]+=ans;f[i][y]-=f[i][y]/mo*mo;
                    }sum+=x;
        }
        printf("%d\n",f[n][0]);
    }
}
版权声明:既然是蒟蒻写的文,那么各位大爷就将就着看吧~跑的比西方记者慢多了233 举报

相关文章推荐

【NOIP2013模拟】粉刷匠 题解&代码

原题Description赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= =现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍。赫克托有K桶颜色各不相同的油漆,第i...

【NOIP2013模拟】导弹防御塔

DescriptionFreda的城堡—— “Freda,城堡外发现了一些入侵者!” “喵…刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~” “可是入侵者已经接近城堡了呀!” “别担心...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

NOIP2013模拟10.23君と彼女の恋

题目大意 给定数n、m,求有多少个序列{Ai}满足(∑Ai)=n(\sum Ai)=n且Aimod m互不相同,方案数对905 229 641取mod(顺序不同,也算不同方案)首先对于序列{Ai}我...

【NOIP2013中秋节模拟】长方形

Description鸡腿是CZYZ的著名DS,但是不想学数学的DS不是好GFS,所以鸡腿想通过提高数学水平来增强他的GFS气质!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿增强了GFS气质,所以现...

【NOIP2013模拟联考2】三角阵(tri) 题解

原题Description把3个相同的小三角形按如下方式连接起来就形成了一个一级三角阵。我们把位于顶端的小三角形标记为T,位于左端的小三角形标记为L,位于右端的小三角形标记为R。把3个一级三角阵按同样...

【NOIP2013模拟11.5A组】游戏节目

Description有三支队伍,分别是A,B,C。有n个游戏节目,玩第i个游戏,队伍A可以得到的分数是A[i],队伍B可以得到的分数是B[i],队伍C可以得到的分数是C[i]。由于时间有限,可能不是...

【NOIP2013模拟联考7】数列

Description给出一个序列,每个数由一个二元组(a,b)表示,有4中操作 1:把a值在l~r范围内的数乘上x再加上y 2:把b值在l~r范围内的数乘上x再加上y 3:询问a值在l~r范围...

【NOIP2013中秋节模拟】长方形(rectangle)

题目 Description 鸡腿是CZYZ的著名DS,但是不想学数学的DS不是好GFS,所以鸡腿想通过提高数学水平来增强他的GFS气质!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿增强了GFS...

【NOIP2013模拟】水叮当的舞步

Description给出一个N*N的网格,每个格子有它的颜色0~5。 每一次你可以选择一个颜色,然后把左上角的格子所在的联通块里的所有格子变成选择的那种颜色。这里的联通是指两个格子有公共边,并且颜...

【NOIP2013模拟】Freda的传呼机 题解+代码

这题又有点像码农题!!Description为了 随时 与 rainbow快速交流, Freda制造了 两部传呼机 。Freda和 rainbow所在的地方有N座房屋、M条双向 光缆 。每条光缆连接两...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)