30分求助
查看原帖
30分求助
1401899
aikepudelizhi楼主2024/8/17 13:41
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000005,mod=1000000007;
long long n,x,y,d[MAXN];
long long combination(int a, int b){
    if (b > a || b < 0) return 0;
    if (b == 0 || a == b) return 1;
    long long result = 1;
    for(int i = 0; i < b; ++i){
        result *= (a - i);
        result /= (i + 1);
    }
    return result;
}
void prework(){
    d[1]=0;
    d[2]=1;
    d[3]=2;
    for(int i=4;i<=MAXN;i++){
        d[i]=(i-1)*(d[i-1]+d[i-2]);
    }
}
int main(){
    scanf("%lld",&n);
    prework();
    for(int i=0;i<n;i++){
        scanf("%lld%lld",&x,&y);
        if (x - y == 1) printf("0\n");
        else if (y == x) printf("1\n");
        else if (y == 0) printf("%lld\n",d[x]);
        else{
            printf("%lld\n",(combination(x,y)*d[x-y])%mod);
        }
    }
    return 0;
}
2024/8/17 13:41
加载中...