标签:中间 \n icon 限制 NPU 结果 code input scanf
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行2个数n,k。中间用空格分隔。(2 <= n <= 1000, 0 <= k <= 20000)
共T行,对应逆序排列的数量 Mod (10^9 + 7)
1 4 3
6
设f(n,k)表示n个数的排列中逆序数个数为k的排列数。
#include<cstdio> using namespace std; typedef long long ll; const int MAXK = 2e4+5; const int MAXN = 1e3+5; const int mod = 1e9+7; #define min(a,b) (a<b)?a:b int n,k,dp[MAXN][MAXK]; // dp[n,k] = dp[n,k-1] + dp[n-1,k] - dp[n-1,k-n]; int getMod(ll t) { if(t >= mod) return t-mod; if(t<0) return t+mod; return t; } void init() { int i,j; for(i=2;i<=1000;i++) { dp[i][0]=1; for(j=1;j<=i*(i-1)/2&&j<=20000;j++) { ll tmp=0; ll tmp1=dp[i][j-1]; ll tmp2=dp[i-1][j]; ll tmp3=(j>=i)?dp[i-1][j-i]:0; tmp = tmp1+tmp2-tmp3; dp[i][j] = getMod(tmp); } } } int main () { init(); int T; scanf("%d",&T); while (T--){ scanf("%d %d",&n,&k); printf("%d\n",dp[n][k]); } return 0; }
标签:中间 \n icon 限制 NPU 结果 code input scanf
原文地址:https://www.cnblogs.com/Draymonder/p/9556363.html