题意:给定n和a[i](i=0..4),求所有n位5进制数中没有前导0且i出现的次数不超过a[i]的数的个数

2<=n<=15000,0<=a[i]<=3e4

思路:设f(n,a,b,c,d,e)为可以含前导0的答案

则ANS=f(n,a,b,c,d,e)-f(n-1,a-1,b,c,d,e)

考虑对每一种数字出现的情况进行容斥

设dp[i][j]为当前到第i位,数字出现的情况为j,至少有一种数字超过了限制次数的方案数

转移有两种:已经出现过的数字可以再出现一次,没有出现过的数字先强行取a[i]+1个再用组合数计算方案转移

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 31000
#define M 40
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1100000000 ll dp[N][M],fac[N],inv[N],exf[N];
int cnt[N],a[N],n,sta; void add(ll &x,ll y)
{
x+=y;
if(x<) x+=MOD;
if(x>=MOD) x-=MOD;
} ll c(int x,int y)
{
return fac[x]*exf[y]%MOD*exf[x-y]%MOD;
} int lowbit(int x)
{
return x&(-x);
} int calc()
{
memset(dp,,sizeof(dp));
for(int i=;i<=sta;i++)
if(cnt[i^sta]&) dp[][i]=MOD-; //容斥系数
else dp[][i]=;
for(int i=;i<=n;i++)
for(int j=;j<=sta;j++)
{
add(dp[i][j],dp[i-][j]*cnt[j]%MOD);
for(int k=;k<=;k++)
if(!((j>>k)&)&&a[k]<i) add(dp[i][j|(<<k)],dp[i--a[k]][j]*c(i-,a[k])%MOD); //当前数字取a[k]+1个
}
return dp[n][sta];
} int main()
{
//freopen("hdoj5519.in","r",stdin);
//freopen("hdoj5519.out","w",stdout);
int cas;
scanf("%d",&cas);
fac[]=;
for(int i=;i<N;i++) fac[i]=fac[i-]*i%MOD;
inv[]=inv[]=exf[]=exf[]=;
for(int i=;i<N;i++)
{
inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
exf[i]=exf[i-]*inv[i]%MOD;
}
cnt[]=;
for(int i=;i<N;i++) cnt[i]=cnt[i-lowbit(i)]+;
for(int v=;v<=cas;v++)
{
scanf("%d",&n);
for(int i=;i<=;i++) scanf("%d",&a[i]);
sta=(<<)-;
ll ans=calc();
if(a[])
{
n--; a[]--;
ans=(ans-calc()+MOD)%MOD;
}
printf("Case #%d: %I64d\n",v,ans);
}
return ;
}

【HDOJ5519】Kykneion asma(状压DP,容斥)的更多相关文章

  1. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  2. bzoj2669 [cqoi2012]局部极小值 状压DP+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...

  3. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  4. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  5. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  6. [清华集训2015 Day1]主旋律-[状压dp+容斥]

    Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...

  7. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  8. uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

    传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...

  9. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  10. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

随机推荐

  1. .NET中变量生存期

    Web窗体后台 cs 文件中,创建类作用域的变量,在关闭页面的时候并不会消失,当 IIS 站点被关闭的时候,才会调用这个变量的析构函数 但是好像也不肯定在关闭站点才会析构,应该是外层对象析构的时候才会 ...

  2. celery:Unrecoverable error: AttributeError("'unicode' object has no attribute 'iteritems')

    环境描述 python2+django1.9下使用celery异步处理耗时请求. celery使用的是celery-with-redis这个第三方库,版本号为3.0. pip install cele ...

  3. git bush的一些基础命令

    git bush的一些基础命令(不区分大小写) 通过命令创建本地仓库 首先自己需要手动建一个文件夹用于本地仓库 进行如下输入,使用cd跳转到刚刚创建的文件夹中 之后再输入 git init 即可创建 ...

  4. 解决Linux使用php命令 -base comment not found并安装composer

    获取php的安装目录 使用 find / -name php.ini 查看php的安装位置 /usr/local/php/lib/php.ini # cd 到/usr/local/php/lib/ph ...

  5. JZOJ 5344. 摘果子

    Description Input Output Sample Input 7 9 39 6 13 2 22 6 7 4 -19 5 28 6 -17 1 2 1 3 2 4 1 5 4 6 2 7 ...

  6. Java开发学生管理系统

    Java 学生管理系统 使用JDBC了链接本地MySQL 数据库,因此在没有建立好数据库的情况下没法成功运行 (数据库部分, Java界面部分, JDBC部分) 资源下载: http://downlo ...

  7. MTCNN学习进展

    20190618 截止今日,学习了MTCNN预测部分的内容,包括三个网络输入输出之类的东西. 之后需要进一步学习的,NMS原理鞋机,MTCNN训练过程细节,损失函数细节

  8. 牛客第四次多校Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 题目描述 The mode of an integer sequence is the valu ...

  9. 【java】实体类中 Set<对象> 按照对象的某个字段对set排序

    Java利用hibernate进行一对多查询时,把另一张表作为一个属性存进这张表的字段中,返回的类型是set类型,要对返回的set类型进行排序 user表 package onlyfun.caterp ...

  10. [原]sencha touch之NavigationView

    还是直接上代码,都是基本的几个容器控件,没什么还说的 Ext.application({ name:'itkingApp', launch:function(){ var view =Ext.crea ...