BZOJ-2431: [HAOI2009]逆序对数列 (傻逼递推)

2431: [HAOI2009]逆序对数列

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 2401  Solved: 1389
[Submit][Status][Discuss]

Description

对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数。若对于任意一个由1~n自然数组成的

数列,可以很容易求出有多少个逆序对数。那么逆序对数为k的这样自然数数列到底有多少个?

Input

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

Output

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

Sample Input

4 1

Sample Output

3

样例说明:

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

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

HINT

Source

Day1

f[i][j]=Σf[i-1][j-k] k∈[0,i) 求和用和数组存一下,f[i][j]只与前一行有关系,所以开滚动数组

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=1005,MOD=1e4;
 5 int n,m,f[MAX],s[MAX];
 6 int main(){
 7     freopen ("num.in","r",stdin);freopen ("num.out","w",stdout);
 8     int i,j;
 9     scanf("%d%d",&n,&m);
10     for (i=0;i<=m;i++) s[i]=1;
11     for (i=2;i<=n;i++){
12         f[0]=1;
13         for (j=1;j<=m;j++)
14             if (j>=i) f[j]=(s[j]-s[j-i]+MOD)%MOD;
15             else f[j]=s[j]%MOD;
16         for (j=1;j<=m;j++)
17             s[j]=(s[j-1]+f[j])%MOD;
18     }
19     printf("%d",f[m]);
20     return 0;
21 }
时间: 2024-12-21 01:54:47

BZOJ-2431: [HAOI2009]逆序对数列 (傻逼递推)的相关文章

[bzoj 2431][HAOI2009]逆序对数列(递推+连续和优化)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2431 分析: f(i,j)表示前i个数字逆序对数目为j时候的方案数 那么有f(i,j)=∑f(i-1,k)  j-i+1<=k<=j 看似是n*k*k的,但是注意对于每一个i,当j=j+1时候,结果只是f(i,j)基础上加了一个f(i-1,j+1),所以就是n*k的了

BZOJ 2431: [HAOI2009]逆序对数列【dp】

Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? Input 第一行为两个整数n,k. Output 写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果.   Sample Input样例输入 4 1 Sample Output样例输出 3 样例说明: 下列3个数列逆序对

BZOJ 2431 HAOI2009 逆序对数列 递推

题目大意:求1~n的所有排列中有多少种逆序对为k的方案数 令f[i][j]为前i个数的排列中逆序对数为j的方案数 那么我们将第i个数插入1~i-1的排列中 可以产生0~i-1个逆序对 于是有 f[i][j]=Σf[i-1][k] (j-i+1<=k<=j) 维护前缀和即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 1010

bzoj 2431: [HAOI2009]逆序对数列

一个比较弱智的DP 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8 #include<vector> 9 #define M 1009 10 #define EPS 1e-10 11

2431: [HAOI2009]逆序对数列

2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 954  Solved: 548[Submit][Status] Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? Input 第一行为两个整数n,k. Output 写入一个整数,

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

http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, 所以放在i+1后面的所有数都会与i+1形成逆序对 转移方程:dp[i][j]=Σ dp[i-1][j-k]  k∈[0,min(j,i-1)] 前缀和优化 朴素的DP #include<cstdio> #include<algorithm> using namespace std;

bzoj2431: [HAOI2009]逆序对数列(前缀和优化dp)

2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2312  Solved: 1330[Submit][Status][Discuss] Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? Input 第一行为两个整数n,k. Ou

BZOJ2431: [HAOI2009]逆序对数列

2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 473[Submit][Status] Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? Input 第一行为两个整数n,k. Output 写入一个整数,

洛谷P2513 [HAOI2009]逆序对数列

P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这样自然数数列到底有多少个? 输入输出格式 输入格式: 第一行为两个整数n,k. 输出格式: 写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对10000求余数后的结果. 输入输出样例 输入样例#1: 4 1 输出样例#1: 3 说明 样例说明: