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 组合数的更多相关文章

  1. 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 ...

  2. noj 2033 一页书的书 [ dp + 组合数 ]

    传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 53            测试通过 : 1 ...

  3. 【区间dp+组合数+数学期望】Expression

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...

  4. 【题解】CF1056F Write the Contest(三分+贪心+DP)

    [题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...

  5. 2019 牛客暑期多校 G subsequence 1 (dp+组合数)

    题目:https://ac.nowcoder.com/acm/contest/885/G 题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零 思路:我们很容易就可以看 ...

  6. hdu----(5045)Contest(数位dp)

    Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)

    DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...

  8. Contest 20140708 testA && testC

    testA 输入文件: testA.in  输出文件testA.out 时限2000ms 问题描述: 如果一个数化为一个二进制数之后(没有前导0),0的个数>=1的个数.那么这个数就是方数. E ...

  9. Contest20140705 testB DP

    testB 输入文件: testB.in 输出文件testB.out 时限2000ms 问题描述: 方师傅有两个由数字组成的串 a1,a2,⋯,an 和 b1,b2,⋯,bm.有一天,方师傅感到十分无 ...

随机推荐

  1. Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

    由于国内的运营商问题,双卡手机获取IMSI号问题要根据厂商API 来实现. 下面我们就来做一套完整的分析运营商获取IMSI号逻辑. 1,首先我们要判断手机的平台. 1.1,判断手机是否MTK平台 1 ...

  2. JQuery和UpdatePannel的问题

    转: http://www.cnblogs.com/Tim_Liu/archive/2010/11/25/1887937.html 最近在做一个项目,因为涉及到的字段数量很多所以想偷把懒,便使用了Up ...

  3. web安全培训笔记

    1.漏洞获取方法 1)扫描器扫描 2)乌云 3)线上服务漏洞 样例: 线上crm->管理员弱口令->后台上传头像处漏洞->上传php文件->进入内网->扫描内网拓扑-&g ...

  4. 史上最全的iOS各种设备信息获取总结

    来源:si1ence 链接:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述一下各种信息 ...

  5. SQL语句中"where 1=1"和"where 1=0"的作用

    where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where 1=1 在多条件查询中的困扰 举个例子,如果您做查询页面,并且,可查询的选项有 ...

  6. Android开发之ViewPager实现轮播图(轮播广告)效果的自定义View

    最近开发中需要做一个类似京东首页那样的广告轮播效果,于是采用ViewPager自己自定义了一个轮播图效果的View. 主要原理就是利用定时任务器定时切换ViewPager的页面. 效果图如下: 主页面 ...

  7. 文件MD5查看器工具与源码实现及下载

    由于工作中经常需要查看文件的MD5值,先前网上找了几个MD5值查看工具,但基本都是选择文件,还没有复制功能,于是今天我就自己编写了个MD5查看工具,支持文件拖拽查看,并可以复制功能. 由于本工具比较小 ...

  8. php递归创建目录

    /** * 递归创建目录 * @param [string] $path [创建的目录] * @return [type] [description] */ function mk_Dir($path ...

  9. js--小结④

    举例子,一个demo.提醒自己经常性会在onclick 和function()这两个地方出错 onclick会输少一个字母 function会忘记输括号

  10. WEB 中的一些名词解释

    OOP: 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构. AOP: AOP为Aspect Oriented Programmin ...