POJ3761 Bubble Sort

对1~n组成的序列进行冒泡排序,一共进行了k趟,问有几个符合题意的序列。

注意:这里指每一趟是指交换当前相邻的所有逆序对,例如:2 1 4 3进行一趟交换就是1 2 3 4

如果我们细心观察,就会发现,需要进行的趟数等于序列中对于某个最多逆序对数的数。例如:在序列 3 2 1 4中,3的逆序对为0,2的逆序对为1,1的逆序对为2,4的逆序对为0,一共排序2次。

直接计算最大逆序对对数为k对的排列数不方便,这里有一个非常巧妙的方法,g[k]表示最大逆序对对数小于等于k对的排列总数,那么最终的答案就是g[k] - g[k-1]。

对于前k个最大的数,他们的最大逆序对对数不会超过k个,因此对于前k大的数有k!种排列,则对于第k大之后的数,每个数的位置有k+1种,那么总共就有 k! * (k+1)^(n-k)种情况。

#include<cstdio>
#define tsy 20100713
using namespace std;
typedef long long LL;
LL jc[1000005];
void init()
{
	jc[0] = 1;
	jc[1] = 1;
	for(int i = 2; i <= 1000000; i++)
	{
		jc[i] = jc[i-1]*(i%tsy)%tsy;
	}
}
LL n;
LL ksm(LL x,LL k)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = (res*x)%tsy;
		k >>= 1;
		x = (x*x)%tsy;
	}
	return res;
}
LL getans(LL k)
{
	return (jc[k]*ksm(k+1,n-k))%tsy;
}
int main()
{
	init();
	int T;
	LL k;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%I64d%I64d",&n,&k);
		printf("%I64d\n",(getans(k) - getans(k-1) + tsy)%tsy);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 03:12:33

POJ3761 Bubble Sort的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

HDU 5775:Bubble Sort(树状数组)

http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Problem Description P is a permutation of the integers from 1 to N(index starting from 1).Here is the code of Bubble Sort in C++. for(int i=1;i<=N;++i) for(int j=N,t;j>i;—j) if(P[j-1] > P

hdu 5775 Bubble Sort(2016 Multi-University Training Contest 4——树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 636    Accepted Submission(s): 378 Problem Description P is a permutation of the

Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

Bubble Sort

referrence: GeeksforGeeks Bubble sort is the simplest sorting algorithm that works by repeatedly swapping the adjacent elements if they are in wrong order. Example:First Pass:( 5 1 4 2 8 ) –> ( 1 5 4 2 8 ), Here, algorithm compares the first two elem

冒泡排序(Bubble Sort)

常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble Sort算法,php版本的.冒泡排序不适合在待排序的数据集特别大的情况下,这里只是一个简易的demo,待排序的数据在10以内. 冒泡排序算法有2种极端的情况所导致的算法复杂度是不一样的: 所有的数据集都是有序的,则此时通过算法优化可以是算法的复杂度从 O(n^2) 将至 O(n) 所有的数据集都是

CodeForcesGym 100517B Bubble Sort

Bubble Sort Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Original ID: 100517B64-bit integer IO format: %I64d      Java class name: (Any) 解题:我们发现假设当前位选择1,那么发现比1大的并且没有使用的有b个,那么当前为选1,后面就还有$2^{b-1}$种方式,所以贪心的选,只要

codeforces 340D Bubble Sort Graph(dp,LIS)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud  Bubble Sort Graph Iahub recently has learned Bubble Sort, an algorithm that is used to sort a permutation with n elements a1, a2, ..., an in ascending order. He is bored of this so simple al

POJ 3761:Bubble Sort——组合数学

题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法,只要数列有序就立刻停止,而不用再检验一遍. 估计多数人都是找规律吧,先看出递推,然后求出通项……这个题只有找出通项公式才能通过,所以首先公布答案: K!((K + 1) ^ (N - K) - K ^ (N - K)) 好吧,现在让我们来证明一下. 首先定义函数d(x),对于1~N的一个排列,d(