1. 程式人生 > >51nod1020 逆序排列

51nod1020 逆序排列

amp 直接 技術分享 span ring queue std iostream scanf

t<=10000個問,每次問n<=1000的全排列中逆序數對為k<=10000個的有多少,mod 1e9+7。

直接dp,$f(i,j)$--i的全排列中逆序數對為j的有多少,$f(i,j)=\sum_{k=max(0,j-i+1)}^{j} f(i-1,k)$,這東西記個前綴和即可n^2。

然後就沒了

技術分享圖片
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<stdlib.h>
 5 //#include<queue>
 6 //#include<math.h>
7 //#include<time.h> 8 //#include<iostream> 9 using namespace std; 10 11 int t,n,K; 12 #define maxn 1011 13 #define maxm 20011 14 15 const int mod=1e9+7; 16 int f[maxn][maxm]; 17 int main() 18 { 19 n=1000,K=20000; 20 f[1][0]=1; 21 for (int i=2;i<=n;i++) 22 { 23 f[i][0]=1; 24
for (int j=1,to=min(i*(i-1)/2,K);j<=to;j++) 25 f[i][j]=((f[i][j-1]+f[i-1][j])%mod-(j>=i?f[i-1][j-i]:0)+mod)%mod; 26 } 27 scanf("%d",&t); 28 while (t--) {scanf("%d%d",&n,&K); printf("%d\n",f[n][K]);} 29 return 0; 30 }
View Code

51nod1020 逆序排列