NC219004. 小G的排列-加强版
描述
输入描述
输入包含组测试用例,第一行一个整数接下来行每行两个整数
输出描述
输出行,第行为第组测试用例的答案。
示例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; }