列表

详情


NC219004. 小G的排列-加强版

描述

找出满足以下条件的排列的数量:
1.
2.
3.
4. 若对于整数对满足:任意都有。则必须满足
对答案

输入描述

输入包含组测试用例,第一行一个整数
接下来行每行两个整数

输出描述

输出行,第行为第组测试用例的答案。

示例1

输入:

4
5 2
3 1
999 666
5555 3333

输出:

92
0
829050504
284425727

原站题解

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

pypy3 解法, 执行用时: 825ms, 内存消耗: 176900K, 提交时间: 2021-08-24 16:00:47

mod = 1000000007
fac = [0 for i in range(10000001)]
fac[0] = 1
for i in range(1, 10000001):
    fac[i] = i * fac[i - 1] % mod
    
def sol(n, m):
    return 0 if n < m else (n - m + 1) * fac[n - m + 1] * (1 + (1 if m > 1 else 0)) % mod

for cas in range(int(input())):
    n, m = map(int, input().split())
    ans = ((fac[n] - (sol(n, m + 1) - sol(n, m + 2))) % mod + mod) % mod
    print(ans)

C++ 解法, 执行用时: 397ms, 内存消耗: 157052K, 提交时间: 2021-08-21 11:49:39

#include <iostream>
using namespace std;
long long d=1e9+7,n,m,f[2][10000001],i=1;
int main(){
	for (f[0][0]=1;i<10000001;i++)f[1][i]=(f[0][i]=f[0][i-1]*i%d)*i%d;
	cin>>i;while(i--)cin>>n>>m,cout<<(f[0][n]+((n>m)*f[1][n-m-1]-f[1][n-m]+d)*(1+(m>1)))%d<<endl;
}

上一题