Contest 20140708 testB dp 组合数
testB
输入文件: testB.in 输出文件testB.out 时限3000ms
问题描述:
定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足下面两个条件:
(1)1<=a1<=b1<a2<=b2<….<ak<=bk<=n 。其中n是给定的正整数。
(2)b1-a1,b2-a2,….,bk-ak两两互不相同。
现在方老师想知道给定n的情况下有多少种不同的长度为k的方序列。
答案取模10^9+7
输入描述:
第一行一个数t表示有t组测试数据。(t<=2*10^5)
第二行至第t+1行每行两个数n和k。(1<=k<=1000 , 1<=n<=1000)
输出描述:
一共t行,每一行表示一个答案。
样例输入:
6
1 1
2 1
2 2
3 1
3 2
3 3
样例输出:
1
3
0
6
2
0
经过观察,k不可能大于50,将(a[i],b[i])看做一个区间,原题转化为选k各不同的正整数,使其总和<=n。
dp[i][j]表示选到第i个数,和为j的方案个数。对于dp中每一种合法方案,通过组合数算出答案。
这道题难点在于多次dp的使用,越界的处理等
总结一点经验:当在较大数据下,你的答案与标答有个位数的差别时,有以下两种可能:1、数组小范围越界,2、你将1000000007打成了1000000009
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define PROB "testB"
#ifdef unix
#define LL "%lld"
#else
#define LL "%I64d"
#endif
#define MAXN 1002
#define VAL1 1000000007
//define deal(x,y) x+=y;if (x>=VAL1)x%=VAL1;
typedef unsigned long long qword;
qword dp[MAXN+][];//x表示区间和,y表示个数,dp表示区间长度组合数,已省略第一维
qword dp2[MAXN+][];//x表示总和,y表示个数,dp表示答案
qword fact[MAXN+];
qword c[MAXN+][MAXN+];
int n;
inline void deal(qword &x,qword y)
{
x+=y;
if (x>=VAL1)x%=VAL1;
}
void init()
{
int i,j,k;
//cout<<"a1"<<endl;
fact[]=;
for (i=;i<=MAXN;i++)fact[i]=(fact[i-]*i)%VAL1;
c[][]=;
for (i=;i<=MAXN;i++)
{
for (j=;j<=i;j++)
{
c[i][j]=(((j)?c[i-][j-]:)+c[i-][j])%VAL1;
}
}
dp[][]=dp[][]=;
//cout<<"a2"<<endl;
for (k=;k<=MAXN;k++)
{
for (i=MAXN-;i>=;i--)
{
for (j=;j>=;j--)
{
if (dp[i][j]&&i+k<=MAXN)
{
deal(dp[i+k][j+],dp[i][j]);
}
}
}
}
//cout<<"a3"<<endl;
for (i=;i<=MAXN;i++)
{
for (j=;j<=;j++)
{
dp2[i][j]=;
for (k=;k<=i-j;k++)
{
if (j++i-j-k->=i-j-k)
deal(dp2[i][j],dp[k][j]*fact[j]%VAL1*c[(j+)+(i-j-k)-][i-j-k]%VAL1);
}
}
}
}
int main()
{
//freopen(PROB".in","r",stdin);
//freopen(PROB".out","w",stdout);
init();
qword ans;
int m,x,y;
scanf("%d",&m);
while (m--)
{
scanf("%d%d",&x,&y);
if (y>)printf("0\n");else printf(LL"\n",dp2[x][y]);
}
}
Contest 20140708 testB dp 组合数的更多相关文章
- Andrew Stankevich's Contest (21) J dp+组合数
坑爹的,,组合数模板,,, 6132 njczy2010 1412 Accepted 5572 MS 50620 KB C++ 1844 B 2014-10-02 21:41:15 J - 2-3 T ...
- noj 2033 一页书的书 [ dp + 组合数 ]
传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 53 测试通过 : 1 ...
- 【区间dp+组合数+数学期望】Expression
https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...
- 【题解】CF1056F Write the Contest(三分+贪心+DP)
[题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...
- 2019 牛客暑期多校 G subsequence 1 (dp+组合数)
题目:https://ac.nowcoder.com/acm/contest/885/G 题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零 思路:我们很容易就可以看 ...
- hdu----(5045)Contest(数位dp)
Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)
DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...
- Contest 20140708 testA && testC
testA 输入文件: testA.in 输出文件testA.out 时限2000ms 问题描述: 如果一个数化为一个二进制数之后(没有前导0),0的个数>=1的个数.那么这个数就是方数. E ...
- Contest20140705 testB DP
testB 输入文件: testB.in 输出文件testB.out 时限2000ms 问题描述: 方师傅有两个由数字组成的串 a1,a2,⋯,an 和 b1,b2,⋯,bm.有一天,方师傅感到十分无 ...
随机推荐
- 查看源码Vim+Cscope
http://blog.csdn.net/huiguixian/article/details/7044869
- vxworks
VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统.Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Mi ...
- iOS UIKit:CollectionView之布局(2)
Collection view使用UICollectionViewFlowLayout对象来管理section中的cell,该对象是一种流布局方式,即在collection view中的section ...
- JVM体系结构
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/5187049.html ...
- Entity Framework Demo(一) 简单搭建环境
Entity Framwork(实体框架,简称EF)是ORM(Object Relational Mapping,对象映射关系)的一个解决方案. EF允许项目将数据库的表映射为实体,并封装了操作方法, ...
- Spring入门Hello World
这里是关于Hello World的一些基本的操作 Spring 是一个重量级的容器框架,用来配置bean并维护bean之间的关系的框架 想要最初的使用Spring就要学会最基本的配置 <1> ...
- Android 读取txt文件并以utf-8格式转换成字符串
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 使用EncodingUtils 今天用到了城市选择三级联动的库,用的这个:https://gi ...
- c语言学习之基础知识点介绍(七):循环结构
本节主要介绍循环结构 一.while循环 /* 语法: while(表达式){ //循环体; } 注意:循环变量.循环条件和循环控制语句三者缺一不可. 例如: */ ; //循环变量 ){ //循环条 ...
- setTimeout 和 setInterval区别
setTimeout和setIntelval都有定时的功能!!!取消定时功能的时候,都有对应的clearTimeout以及clearInterval与之对应. 但是他们之间是有区别的! setTime ...
- C#中的面向对象编程
所有的面向对象语言都具有3个基本特征,C#也是不例外的. 封装---把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 继承---通过继承可以复用父类的对象: 多态---允许将子对象赋值给 ...