P4071求调 30pts
  • 板块学术版
  • 楼主封禁用户
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/9 09:25
  • 上次更新2024/7/11 21:51:09
查看原帖
P4071求调 30pts
894974
封禁用户楼主2024/7/9 09:25
#include <bits/stdc++.h>
using namespace std;
long long T;
const long long MOD=1e9+7,MAXN=1e6+5;
long long inv[1000005],fac[1000005],gett[1000005];
long long C(long long n,long long m,long long p)
{
	if (n<m) return 0;
	return fac[n]*inv[m]%p*inv[n-m]%p;
}
long long mul(long long x,long long k){ //对p取模
    long long res = 1;
    while(k){
        if(k&1) res = ( res * x ) % MOD;
        x = (x*x) % MOD;
        k>>=1;
    }
    return res;
}
void pre()
{
	gett[1] = 0;
	gett[2] = 1;
	fac[1] = 1;
	inv[0] = inv[1] = 1;
	for(long long i = 3;i < MAXN;++ i)
		gett[i] = (i-1) * (gett[i-1] + gett[i-2]) % MOD;
	for(long long i = 2;i < MAXN;++ i)
	{
		fac[i] = fac[i-1] * i % MOD;
		inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
	}
	for(long long i = 1;i < MAXN;++ i)
		inv[i] = inv[i-1] * inv[i] % MOD;
	return;
}

int main()
{
	pre();
	cin>>T;
	while (T--)
	{
		long long n,m;
		cin>>n>>m;
		if (n==m) 
		{
			cout<<1<<'\n';
			continue;
		}
		long long tmp=gett[n-m];
		cout<<C(n,m,MOD)*tmp<<'\n';
	}
	return 0;
}
2024/7/9 09:25
加载中...