问题描述
考虑冒泡排序的一种实现。
冒泡排序 (A[], n)
> 圆形 = 0
> 而 A 未排序
>> 回合:= 回合 + 1
>> 对于 i := 1 到 n - 1
> > > 如果 (A[i] > A[i + 1])
> > > > 交换(A[i], A[i + 1])
求1 .. n的排列中,有多少个排列使得A被扫描了K遍,亦即算法结束时round == K。
答案模20100713输出。
输入格式
输入包含多组数据。每组数据为一行两个整数N,K。
输出格式
对每组数据,输出一行一个整数表示答案。
#include <iostream>
using namespace std;
const int mod = 2020082307;
typedef long long ll;
const int N = 1e6+10;
f[N];
quick( a, n){
an = 1;
while(n){
if(n&1) ans = (ans*a)%mod;
a = (a*a)%mod;
n>>=1;
}
return an;
}
void init(){
f[0] = f[1] = 1;
for(int i = 2;i <= N-10;i++){
f[i] = (f[i-1]*i)%mod;
}
}
int main(){
init();
int t;scanf("%d",&t);
int n,k;
while(t--){
scanf("%lld%lld",&n,&k);
an = (f[k]*(quick(k+1,n-k)-quick(k,n-k)+mod)%mod)%mod;
printf("%lld\n",an);
}
return 0;
}