poj3761 bubble sort

2024-06-11 13:32
文章标签 sort bubble poj3761

本文主要是介绍poj3761 bubble sort,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:已知N,对N的一个排列进行冒泡排序,共K趟后排成升序,求一共有多少个这样的排列(mod 20100713)。

最开始我沙茶地得出了个结论,一趟就是最大值沉底,其它不变,因此和最长下降子序列有关(其实选择排序应该是这样)。然而实际上不是。每排一趟,一个数的逆序数最多-1(沉底那个除外),因此题目就是让你构造逆序数最多的一个数的逆序数是K的N排列。

设f(i,K)为前i小的数进行排列,其中逆序数最大的一个数的逆序数小于等于K的方案数。当i小于等于K时,显然无法使得任意数的逆序数超过K,故f(i, K) = f(i-1, K) * i;  i>K时,考虑将i放入这个排列,因为i是目前最大一个数,所以要使得i处于最后K+1个位置才能保证在i后面的之前放的数不超过K个。通项易得为f(N, K) = K!*(K+1)^(N-K)。然而这只是最大逆序数小于等于K的方案数,这题最巧妙的地方就是恰好等于K的方案数可以作差求得,为f(N,K)-f(N,K-1)。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
const LL tsy = 20100713;
const int MAXN = 1000010;
int T;
LL N, K;
LL jc[MAXN];
LL ksm(LL a, LL b)
{LL res = 1;for (; b>0; b>>=1, a=a*a%tsy)if (b&1) res = res * a % tsy;return res;
}
inline LL getx(LL n, LL k) {return jc[k] * ksm(k+1, n-k) % tsy;
}
int main()
{scanf("%d", &T);jc[0] = 1;for (LL i = 1; i<MAXN; ++i)jc[i] = jc[i-1] * i % tsy;while (T--) {scanf("%I64d%I64d", &N, &K);LL ans = (getx(N, K) - getx(N, K-1)) % tsy;printf("%I64d\n",  (ans + tsy) % tsy);}return 0;
}


这篇关于poj3761 bubble sort的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051302

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

C/C++经典排序问题,sort函数使用

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 大家在学习C语言的时候,是不是经常被排序算法折磨的很难那首,其实都是但是在C++中有专门的,排序函数,而且支持自定义排序算法。下面我就带大家看看,sort函数简单的数组排序中的应用。 2. 正文 2.1 问题 题目描述

Hive中order by,sort by,distribute by,cluster by的区别

一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。关于order by的详细介绍请参考这篇文章:Hive Order by操作。 二:sort by sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort

list.sort实现根据对象的属性值对集合进行排序

list.sort实现根据对象的属性值对集合进行排序,如下所示List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map1 = new HashMap<>();map1.put("gz_id",1);map1.put("aaa","aaa");Map<String,Object> map2 = new H

HDU 1890 Robotic Sort

题意: 将一列数字排序  排序规则是  每次找到最小值的位置loc  将1~loc所有数字颠倒  然后删掉第一位  直到排好序  排序要求是稳定的 思路: 这题要做的是  寻找区间最小值位置  翻转区间  的操作  因此可以想到用splay 只需要每个节点记录一个small  就可以实现找到最小值位置 翻转区间操作就是将splay的超级头转到最上面使之成为根  再把loc转到根下面

Go-Sort(Cont)

倒序。 package mainimport ("fmt""sort")func main() {data := []string{"one", "two", "three", "four"}sort.Strings(data)fmt.Println(data) //[four one three two]sort.Sort(sort.Reverse(sort.StringSlice(data

sort对二维字符数组排序

转载自(http://blog.csdn.net/unimen/article/details/6843977) 由于二维字符数组的第二维没有赋值运算符,即不能对整个一维数组进行赋值,因此是无法直接对二维数组用sort进行排序的,解决办法有二种: 代码一: #include <iostream> #include <cstring> #include <algorithm> usin

Insertion Sort Integer Array Insertion Sort Linked List

Sort Integer Array using Insertion sort. //********************************************************************************************************/* Insertion Sort 原理:就是前面的sort部分全部是相对值,从后面拿一个元素,然后跟

Merge Sort Array and Merge Sort Linked List

Merge Sort Array: 看完stanford的 CS106B的video,https://www.youtube.com/watch?v=LlNawf0JeF0&list=PLnfg8b9vdpLn9exZweTJx44CII1bYczuk&index=55 醍醐灌顶; public class Solution {/*** @param A: an integer array* @