题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

4 1

输出样例#1:

3

说明

样例说明:

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

测试数据范围

30%的数据 n<=12

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

一道简单题,但我觉得可以做到更大的数据,比方说加两个0

从小到大考虑每一位,先考虑1,如果1位于i这个位置,那1与1~i-1这些位置的每一个数都会产生一个逆序对,与i+1~n这些位置的数都不会产生逆序对,至于具体每个数字是什么对于1的贡献没有影响

然后从排列里把1去掉,变成一个2~n的排列,这个排列与1~n-1的排列是等价的,于是问题转化成了一个较小的问题

然后可以dp

dp[i][j]表示1~i的排列,要有j个逆序对的方法数,枚举当前位置产生的逆序对来转移,这个东西本来是nk^2的,但是发现一个位置转移的时候是连续的一段,用前缀和优化去掉一个k即可

其实这个问题等价于有n个带编号的盒子排成一列,一共放k个球,标号为i的盒子里不能放超过i-1个球,求方法总数,这应该是有更好的做法的

UPD1:这个东西的生成函数是 $ (1)(1+x)(1+x+x^2)(1+x+x^2+x^3)...(1+x+x^2+...+x^{n-1}) $ 即 $ \prod_{p=1}^{n}\sum_{q=0}^{p-1}x^q $ ,这个形式过于美妙让人很难不认为它有一个优美的通解

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <string>
 6 #include <cstring>
 7 #include <cmath>
 8 #include <map>
 9 #include <stack>
10 #include <set>
11 #include <vector>
12 #include <queue>
13 #include <time.h>
14 #define eps 1e-7
15 #define INF 0x3f3f3f3f
16 #define MOD 10000
17 #define rep0(j,n) for(int j=0;j<n;++j)
18 #define rep1(j,n) for(int j=1;j<=n;++j)
19 #define pb push_back
20 #define mp make_pair
21 #define set0(n) memset(n,0,sizeof(n))
22 #define ll long long
23 #define ull unsigned long long
24 #define iter(i,v) for(edge *i=head[v];i;i=i->nxt)
25 #define max(a,b) (a>b?a:b)
26 #define min(a,b) (a<b?a:b)
27 #define print_runtime printf("Running time:%.3lfs\n",double(clock())/1000.0)
28 #define TO(j) printf(#j": %d\n",j);
29 //#define OJ
30 using namespace std;
31 const int MAXINT = 100010;
32 const int MAXNODE = 100010;
33 const int MAXEDGE = 2*MAXNODE;
34 char BUF,*buf;
35 int read(){
36     char c=getchar();int f=1,x=0;
37     while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
38     while(isdigit(c)){x=x*10+c-'0';c=getchar();}
39     return f*x;
40 }
41 char get_ch(){
42     char c=getchar();
43     while(!isalpha(c)) c=getchar();
44     return c;
45 }
46 //------------------- Head Files ----------------------//
47
48 int n,k;
49 int dp[10010],sum[10010];
50 void get_input();
51 void work();
52 int main() {
53     get_input();
54     work();
55     return 0;
56 }
57 void work(){
58     fill(sum,sum+k+1,1);
59     for(int i=2;i<=n;i++){ //box no i,can take 0~i-1
60         rep0(j,k+1){
61             dp[j] = (j-i+1>0?sum[j]-sum[j-i]:sum[j]);
62         }
63         sum[0]=dp[0];
64         rep1(j,k){
65             sum[j]=(sum[j-1]+dp[j])%MOD;
66         }
67     }
68     printf("%d\n",(dp[k]+MOD)%MOD);
69 }
70 void get_input(){
71        n=read();k=read();
72 }

转载于:https://www.cnblogs.com/LoveYayoi/p/6921138.html

洛谷 P2513 [HAOI2009]逆序对数列相关推荐

  1. BZOJ 2431: [HAOI2009]逆序对数列【DP】

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列aiai,如果有i<ji<j且 ...

  2. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...

  3. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

  4. bzoj 2431: [HAOI2009]逆序对数列

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2190  Solved: 1262 [Submit][St ...

  5. 【洛谷 P2513】 [HAOI2009]逆序对数列(DP)

    题目链接 这种求方案数的题一般都是\(dp\)吧. 注意到范围里\(k\)和\(n\)的范围一样大,\(k\)是完全可以更大的,到\(n\)的平方级别,所以这暗示了我们要把\(k\)写到状态里. \( ...

  6. 洛谷P1908求逆序对【树状数组】

    逆序对 逆序对的定义:对于给定的一段正整数序列,逆序对就是序列中 ai>aj,i<ja_i>a_j,i<jai​>aj​,i<j,让统计逆序对的个数. 本题的数据加 ...

  7. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  8. P2513-[HAOI2009]逆序对数列【dp,前缀和】

    正题 题目链接:https://www.luogu.org/problemnew/show/P2513 题目大意 求长度为nnn逆序对为kkk个的序列总数. 解题思路 设fi,jf_{i,j}fi,j ...

  9. 分解质因数-洛谷P3200 [HNOI2009]有趣的数列

    https://www.luogu.org/problem/show?pid=3200 首先,我们不能保证要求的数的逆元和模域互质: 所以我们要用分解质因数来抵消除法: 其实逆元的话即使可行也会超时: ...

最新文章

  1. 学位论文是根,学术论文是叶
  2. 【手把手教你树莓派3 (二)】 启动wifi模块
  3. 输入mysql -v_Mysql数据库使用笔记
  4. Scala函数使用可变参数
  5. ffmpeg-20160714-git-bin.7z
  6. 健康管理平台设计与实现
  7. 中望cad文字显示问号怎么办_中望CAD图纸显示乱码怎么办?
  8. 四步实现Grub4DOS引导img文件打造启动U盘
  9. 计算机基础——网卡(网络适配器network adaptor)
  10. 解决:启动program时出现问题,找不到指定模块
  11. Win10修复Linux引导
  12. 2021-18.面向对象进阶
  13. 喝java茶,我为你泡一杯花茶
  14. 北京最值得逛的50个地方
  15. 计算机应用能力考试裸考,五分钟拯救裸考生,计算机二级这样就能过
  16. 温水煮青蛙,我还能活多久
  17. linux用户登录报密码不对,Linux用户登录密码的生成
  18. Excel数据转化为矩阵
  19. ICG-Hydrazide,吲哚菁绿-酰肼,ICG-HZ结构式,溶于二氯甲烷等部分有机溶剂,
  20. 视频怎么转换gif图?很容易学会的转换方法

热门文章

  1. c语言输出26个英文字母的能量值,菜鸟求助,写一个随机输出26个英文字母的程序...
  2. rds oracle utl file,本地Oracle数据上传到AWS的RDS
  3. java多线程w3c_多线程
  4. 华为笔记本matebook13_华为MateBook 13_HUAWEI MateBook 13(i5 8265U/8GB/256GB/独显)_笔记本导购-中关村在线...
  5. Hibernate本地SQL查询SQLQuery
  6. oracle查询中表的连接顺序 手工指定
  7. .Net Core Nuget还原失败
  8. 【Luogu3383】【模板】线性筛素数
  9. 把一个函数作为参数传入到函数中
  10. 【开源】.Net Api开放接口文档网站