【NOIP2013模拟】粉刷匠
来源:互联网 发布:淘宝众筹平台入口 编辑:程序博客网 时间:2024/04/28 05:24
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个空中,每个空都必须要放,所以有
然后这道题就解决了。 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 105using 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]); }}
0 0
- 【NOIP2013模拟】粉刷匠
- 【NOIP2013模拟】粉刷匠 题解&代码
- 高中OJ3503. 【NOIP2013模拟11.4B组】粉刷(paint)
- [jzoj]3503. 【NOIP2013模拟11.4B组】粉刷(paint)(位运算优化)
- 粉刷匠
- 2014.7.8模拟赛【笨笨当粉刷匠】
- [BZOJ1296][SCOI2009]粉刷匠
- 1296: [SCOI2009]粉刷匠
- bzoj1296【SCOI2009】粉刷匠
- 粉刷匠&集体照
- bzoj 1296 【粉刷匠】
- BZOJ1296: [SCOI2009]粉刷匠
- BZOJ1296: [SCOI2009]粉刷匠
- bzoj1296 [SCOI2009]粉刷匠
- bzoj1296: [SCOI2009]粉刷匠
- BZOJ1296: [SCOI2009]粉刷匠
- 【bzoj1296】[SCOI2009]粉刷匠
- 我是一个粉刷匠
- leetcode 171. Excel Sheet Column Number
- 多个Select语句嵌套
- 【缓存】什么是缓存
- 如何在linux下搭载PHP(Apache)运行环境
- zynq可以从4GB sd卡启动,但是64GB的sd卡却是不能
- 【NOIP2013模拟】粉刷匠
- 抽象类和接口的区别
- JavaScript中的setInterval用法
- Android使用百度地图API实现定位app
- swift学习之路(六)字符串和字符的常用操作
- 端口查询与相关操作
- ios中webview的高级用法
- Acticity的四种启动模式解析
- Java代码判断字符串是否为汉字