1111: 子序列求和

Time Limit: 3 Sec  Memory Limit: 64 MB
Submit: 10  Solved: 2
[Submit][Status][Web Board] [Edit]

Description

给出n个数字,分别为1,2,3,……,n。从中选出t个数字,且这t个数字和为x的方案数为ft,x 。给出m。输出下面的值:
 
数据满足n <= 20000,m <= min(10, n)。

Input

第一行输入T表示测试数据的行数。接下来T行,每行两个数字n, m。T <= 20。

Output

对于每组测试数据,输出一行。

Sample Input

1 4 2

Sample Output

64

HINT

Source

用d[t][x]表示t个数字和为x的方案数,且这t个数字中的最大数字不超过n。
核心思想 : 给d[t][x]中的每个数字减掉一,变成d[t][x-t],d[t][x]应该等于d[t][x-t].
如果这t个数字中的最小数字为1的话,减去1,最小数字就变为0,相当于t-1个数字,d[t-1][x-t]
,然而这两种情况都未考虑,最大数字不超过n的情况,假设d[t][x-t]中最大数字为n,给这t个数字每个加上1,
那么最大数字就为n+1,超过n,所以,要去掉n+1,这个最大数字,减掉这种情况,相当于减掉d[t-1][x-t].
还有一个坑就是A+B-C,由于要取模,所以A+B可能小于C,(A+B-C+MOD)%MOD;
 (d%MOD+MOD)%MOD;

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define maxn 21000
#define LL long long
#define MOD 1000000007
int n,m;
LL answer;
LL d[][maxn*];
LL f[];
void init()
{
memset(d,,sizeof(d));
for(int i=;i<;i++)
f[i]=;
}
LL pow(int a,int b)
{
LL ans=;
for(int i=;i<=b;i++)
{
ans=(ans*a)%MOD;
}
return ans;
}
void solve()
{
for(int i=;i<=n;i++)
d[][i]=;
f[]=pow(,n);
// cout<<f[1]<<endl;
for(int t=;t<=m;t++)
{
for(int x=;x<(t*n);x++)
{
d[t][x]=(d[t][x-t]+d[t-][x-t]-d[t-][x-(n+)] + MOD)%MOD; f[t]=(f[t]*(d[t][x]+))%MOD;
//printf("%d %d %d\n",t,x,d[t][x]);
}
//最小值要么为1,要么不为1,
//当最小值为1时,最大值可能为n,需要减去d[t-1][x-(n+1)];
//当最小值不为1,最大值也可能为n,需要减去d[t-1][x-(n+1)];
//由于这两种情况互斥,所以最多只需要减1次
//cout<<endl;
// while(f[t]<0)
//cout<<f[t]<<endl;
} answer=;
for(int t=;t<=m;t++)
{
// printf("f %d %d\n",t,f[t]);
answer=(answer+f[t])%MOD;
answer=answer%MOD;
}
// while(answer<0)
printf("%lld\n",answer%MOD);
}
int main()
{
// cout<<(-5)%3<<endl;
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
solve();
}
return ;
}

snnu1111(子序列求和)的更多相关文章

  1. [C++]四种方式求解最大子序列求和问题

    问题 给定整数: A1,A2,-,An,求∑jk=iAk 的最大值(为方便起见,假设全部的整数均为负数,则最大子序列和为0) 比如 对于输入:-2,11,-4,13,-5,-2,答案为20,即从A2到 ...

  2. 力扣152,53题,最大子序列求和and积

    本内容为最大子序列的求和和求积.采用DP的思路, 当前值加上小于之前值,则从该节点重新算起. 这个代码只能返回其结果值,但不能返回最后的子序列(待修改). class Solution: def ma ...

  3. ZOJ 3872 Beauty of Array 连续子序列求和

    Edward has an array A with N integers. He defines the beauty of an array as the summation of all dis ...

  4. 深度优先搜索DFS---最优子序列求和问题(1)

    题目: 给定N 个整数(可能有负数),从中选择 K个数,使得这 K个数之和恰好等于一个给定的整数 X:如果有多种方案,那么选择它们中元素平方和最大的一个.例如,从4个整数{ 2, 3, 3 ,4}中选 ...

  5. 单调队列(数列中长度不超过k的子序列和的最值)

    ★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...

  6. “最大子序列和”算法 java

    maxSubSum各自是最大子序列和的4中java算法实现. 第一种算法执行时间为O(N^3),另外一种算法执行时间为O(N^2),第三种算法执行时间为O(nlogn),第四种算法执行时间为线性N p ...

  7. 区间Dp 暴力枚举+动态规划 Hdu1081

    F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Des ...

  8. J Dp

    <span style="color:#000099;">/* ____________________________________________________ ...

  9. Demo003 最大连续子数组问题(《算法导论》4.1-5)

    问题 问题描述  给定n个整数(可能为负数)组成的数组,要求一个数组连续下标和的最大值,数组的元素可正.可负.可为零.  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的 ...

随机推荐

  1. [luoguP1119] 灾后重建(Floyd)

    传送门 基于Floyd的动态规划原理,我们可以只用进行一次Floyd. 而题目给出的限制条件相当于给Floyd加了时间限制而已. 还是得靠对Floyd的理解. ——代码 #include <cs ...

  2. [HDU3062]Party(2-sat)

    传送门 2-sat问题,只需要判断yes或no 所以可以直接连边,缩点,判断同一组的是否在同一个块中. #include <cstdio> #include <stack> # ...

  3. [NOIP2000] 提高组 洛谷P1017 进制转换

    题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...

  4. Python基础教程笔记——第1章

    1.8 函数 pow(x,y) x^y abs(x)          取数的绝对值 round(x)   会把浮点数四舍五入为最接近的整数 floor(x)     向下取整的函数,但是需要先imp ...

  5. Notification通知创建

    Notification通知创建 由于通知是一个远程视图,所以创建通知在状态栏显示需要用到三个主要的对象: 一.PendingIntent对象,用来承载Intent对象的,Intent对象主要是定义通 ...

  6. Mysql相关工具

    •Mysql相关工具 –Mysqlslap  压力测试工具 –Mysqlsla  日志分析工具 –Mysqlreport   效能监控工具 –Mysqlproxy  快速实现读写分离以及负载均衡 –p ...

  7. php 之mysql安全

    php 之mysql安全 原文:https://www.cnblogs.com/mafeng/p/5939329.html. 请浏览原文. 一.服务器配置方面. (1) 打开php的安全模式 php的 ...

  8. Python()- 面向对象三大特性----封装

    封装: [封装]         隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则]      1. 将 ...

  9. Codeforces Round #291 (Div. 2) B. Han Solo and Lazer Gun

    因为是x,y均为整数因此对于同一直线的点,其最简分数x/y是相同的(y可以为0,这里不做除法)于是将这些点不断求最简分数用pair在set中去重即可. #include <cmath> # ...

  10. Beat---hdu2614

    http://acm.hdu.edu.cn/showproblem.php?pid=2614 题目大意   题目就不粘了  就是一个简单的深搜  由于我深搜实在是不懂  就在写一个博客记录一下 #in ...