蓝桥杯练习系统 ID: 81 冒泡排序计数
冒泡排序计数
Description
考虑冒泡排序的一种实现。
bubble-sort (A[], n)
> round = 0
> while A is not sorted
> > round := round + 1
> > for i := 1 to n - 1
> > > if (A[i] > A[i + 1])
> > > > swap(A[i], A[i + 1])
求1 .. n的排列中,有多少个排列使得A被扫描了K遍,亦即算法结束时round == K。
答案模20100713输出。
Input
输入包含多组数据。每组数据为一行两个整数N,K。
Output
对每组数据,输出一行一个整数表示答案。
Sample Input 1
3 3 0 3 1 3 2
Sample Output 1
1 3 2
Hint
HINT:时间限制:1.0s 内存限制:256.0MB
T <= 10 ^ 5。
1 <= K < N < 10 ^ 6。
Source
蓝桥杯练习系统 ID: 81 原题链接: http://lx.lanqiao.cn/problem.page?gpid=T81
DP
1 #include <cstdio> 2 using namespace std; 3 4 const int N = 1e6+10, MOD = 20100713; 5 typedef long long LL; 6 7 LL dp[N];//阶乘 8 LL quickMulti(LL k, LL n){ 9 LL res = 1; 10 while(n){ 11 if(n&1) res = (res * k)%MOD; 12 k = (k * k)%MOD; 13 n >>= 1; 14 } 15 return res; 16 } 17 18 //初始化 19 void init(){ 20 dp[0] = dp[1] = 1; 21 for(int i = 2; i <= 1e6; i ++){ 22 dp[i] = (dp[i-1] * i)%MOD; 23 } 24 } 25 26 int main() 27 { 28 init(); 29 int t; 30 LL n, k; 31 32 scanf("%d", &t); 33 while(t --) 34 { 35 scanf("%lld%lld", &n, &k); 36 LL res = (dp[k]*(quickMulti(k+1,n-k)-quickMulti(k,n-k)+MOD)%MOD)%MOD; 37 printf("%lld\n", res); 38 } 39 return 0; 40 }
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/16027284.html