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. VoltDB公布4.0版本号,大步提高内存实时分析速度,进军操作数据库市场

    号称世界上最快的关系数据库的VoltDB与2014年1月29号(美国东部时间)公布下一代数据库4.0版本号.新的版本号有非常多地方的改进,大步挺高系统性能.在过去的13年,VoltdDB号称自己公司较 ...

  2. RedHat7安装Nginx及第三方模块

    编译安装Nginx 先安装编译过程中所需依赖包# yum -y install gcc pcre-devel openssl-devel zlib-devel jemalloc(更好的内存管理)# w ...

  3. Ubuntu安装sar出错Please check if data collecting is enabled in /etc/default/sysstat

    1.安装sysstat apt-get install sysstat 2.安装后无法使用: Cannot open /var/log/sysstat/sa02: No such file or di ...

  4. Redis Windows版安装及简单使用

    1.Redis简介及优势 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次 ...

  5. List和ArrayList,LinkList的区别

    接口 List<E> 是一个接口: ArrayList<E> 是一个类:是一个实现了List接口的类,因此可以List里面定义的所有的方法都实现了. 1.ArrayList是实 ...

  6. CI框架篇之控制器篇--设置路由(1)

    CodeIgniter 定义默认控制器 当你的网站不存在某个URI 或者 用户直接从根目录访问的时候,CodeIgniter 会加载默认控制器. 打开 application/config/route ...

  7. [功能帮助类] C# BaseRandom随机数,随机字符,可限制范围-帮助类 (转载)

    点击下载 BaseRandom.rar 主要功能如下 .产生随机字符 .产生随机数 .在一定范围内产生随机数 看下面代码吧 /// <summary> /// 编 码 人:苏飞 /// 联 ...

  8. 黑马程序员-集合(二)contains()方法的内部探索

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 我们知道集合是用来存储对象的.在他们实现了众多的接口我们以Arraylist为列子 所有已实现的 ...

  9. OC - 14.NSOperation与NSOperationQueue

    简介 通过NSOperation与NSOperationQueue的组合也能实现多线程 通常将任务封装成NSOperation对象,并将对象添加到NSOperationQueue中实现 NSOpera ...

  10. [Introduction to programming in Java 笔记] 1.3.7 Converting to binary 十进制到二进制的转换

    public class Binary { public static void main(String[] args) { // Print binary representation of N. ...