列表

详情


NC229299. Subpermutation

描述

的排列是一个长度为 的序列,其中从 的每个数字都只出现一次。 的全排列是将 的所有排列按字典顺序连接成一个序列的序列。如果 其中 是满足 的最小索引,则序列p_1,p_2,...,p_n 在字典上小于

以下是此问题中使用的一些符号:

- 的全排列。例如,
- 的所有排列的集合。例如,
- 中等于 的连续子序列的数量。例如,

现在给定,请计算

输入描述

第一行包含一个整数,表示数据组数。
接下来行,每行包含两个整数,如描述中所述。

输出描述

对于每组数据,输出

示例1

输入:

4
2 1
2 2
3 2
4 3

输出:

2
2
4
15

说明:

对于第三组数据,p_3 = \{1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1\}, S_2=\{\{1,2\},\{2,1\}\}p_3中有4个连续子序列等于\{1,2\}\{2,1\}\{\underline{1,2},3,1,3 ,2,\underline{2,1},3,2,3,1,3,\underline{1,2},3,\underline{2,1}\}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 244ms, 内存消耗: 16992K, 提交时间: 2022-08-07 12:45:33

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7,N = 1e6+6;
int f[N],g[N];
void init(){
    f[1] = g[1] = g[0] = f[0] = 1;
    for(int i = 2; i < N; i++){
        f[i] = f[i-1]*i%mod;
        g[i] = (g[i-1]+1)*i%mod;
    }
}
signed main(){
    int t;
    cin >> t;
    init();
    while(t--){
        int n,m;
        cin >> n >> m;
        int ans = ((n*f[m]%mod)*f[n-m]%mod-g[m]+f[m]+mod)%mod;
        cout << ans << '\n';
    }
}

上一题