题目描述

对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数。若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数。那么逆序对数为k的这样自然数数列到底有多少个?

输入

第一行为两个整数n,k。

输出

写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果。

样例输入

4 1

样例输出

3

样例说明:

下列3个数列逆序对数都为1;分别是1 2 4 3 ;1 3 2 4 ;2 1 3 4;

测试数据范围

30%的数据 n<=12

100%的数据 n<=1000,k<=1000

/*
设f[i][j]为前i个数,逆序对数为j的方案数
在i-1个数中加入一个数,新增逆序对数为0~i-1,所以f[i][j]=Σf[i-1][k] (j-i+1<=k<=j)
时间复杂度为O(n^3),采用前缀和优化:f[i][j]=g[i-1][j]-g[i-1][j-i]
*/
#include<cstdio>
#include<iostream>
#define M 1010
#define Mod 10000
using namespace std;
int f[M][M],g[M][M];
int read()
{
char c=getchar();int flag=,num=;
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num*flag;
}
int main()
{
int n=read(),k=read();
f[][]=;
for(int i=;i<=k;i++)g[][i]=;
for(int i=;i<=n;i++)
for(int j=;j<=k;j++)
{
f[i][j]=g[i-][j];
if(j-i>=)f[i][j]=(f[i][j]+Mod-g[i-][j-i])%Mod;
if(j)g[i][j]=g[i][j-];
g[i][j]+=f[i][j];
g[i][j]%=Mod;
}
printf("%d",f[n][k]);
return ;
}

最新文章

  1. Java开发的几个注意点
  2. EasyTouch绑定事件在电脑上点击有效Android上无效的解决方法
  3. asp.net 对数据库表增加,删除,编辑更新修改
  4. 推荐几款制作网页滚动动画的 JavaScript 库
  5. thinkphp5命名规范
  6. Volley用法
  7. 除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。
  8. Photoshop操作指南
  9. HDU 5029 Relief grain --树链剖分第一题
  10. org.springframework.web.context.ContextLoaderListen 报错解决办法
  11. 用xshell操作linux系统的常用命令
  12. (转载)顺序栈c++实现
  13. 正则表达式start(),end(),group()方法
  14. hdu 2032
  15. CaseFile
  16. Linux 环境下 fork 函数和 exec 函数族的使用
  17. Python中随机森林的实现与解释
  18. 百度编辑器ueditor 光标位置的坐标
  19. MySQL的sql_mode模式说明及设置
  20. android的消息处理机制(图文+源码分析)—Looper/Handler/Message[转]

热门文章

  1. 【C#】基础之数组排序,对象大小比较(对比器)
  2. vue下axios和fetch跨域请求
  3. transform、transition 和 animation区别
  4. web页面调用IOS的事件
  5. 解决Homestead yarn , npm run dev, 命令报错问题!
  6. 嵌入式C语言-学习书籍推荐(pdf附上百度云链接)
  7. NetBeans 默认编码修改方法
  8. python json.loads json.dumps的区别
  9. VS打开文件,解决方案资源管理器自动定位到文件位置
  10. RTP/RTCP协议详解