题目链接:https://vjudge.net/problem/POJ-3761

题意:给出n和k,求通过k趟冒泡排序得到长为n的有序排列(元素为n个不同的数)的原排列有多少个。

思路:

先给出反序表的定义:

  令bi(1<=i<=n)為位於i左邊但是大於i的元素個數,就能得到排列a1,a2,...,an的反序表b1,b2,...,b3。比如說,排列5 9 1 8 2 6 4 7 3有反序表2 3 6 4 0 2 2 1 0(在1左邊且大於1的有2個,在2左邊且大於2的有3個,……)。

再给出反序表的重要结论:

  第1個元素的反序數取值範圍是[0,n-1],第i個元素的反序數取值範圍是[0,n-i],最後一個元素的反序數只能是0。并且每個反序數可以在區間內任意取值而不用考慮其他反序數的值,也就是說反序數是相互獨立的。(因为第一个元素的反序数[0,n-1]分别对应n个位置中的一个位置,确定之后去掉这个位置,剩下n-1个位置; 第二个元素的反序数[0,n-1]对应这n-1个位置中的一个,确定之后去掉这个位置,剩下n-2个位置......这样可以得到所有反序表对应的原排列有n!个,原排列本身最多只有n!个,所以反序表和原排列是一一对应的,且反序表中反序数相互独立。)

回到题目:

  不难发现每一趟冒泡排序都会将剩下的>0的反序数减一,所以题目就转变乘最大反序数为k的反序表个数。所以我们可以通过求最大反序数<=k的反序表的个数,元素i的反序数为n-i,令n-i<=k得i>=n-k,即>=n-k的元素其反序数恒<=k,所以其反序数的值可以是其范围内的任意值,共有(k+1)!种可能。对于i<n-k,其反序数范围为[0,k],即k+1种,则共有(k+1)^(n-k-1)种可能。两者相乘得k!*(k+1)^(n-k)。

  同理求出最大反序数<=k-1的个数,相减得k!*[(k+1)^(n-k)-k^(n-k)]。

  然后打表阶乘,利用快速幂取模即可。

AC代码:

#include<cstdio>
using namespace std;
typedef long long LL;
const int maxn=;
const int Mod=; int T;
LL f1[maxn]; void init(){
f1[]=f1[]=;
for(int i=;i<=;++i)
f1[i]=f1[i-]*i%Mod;
} LL qpow(LL a,LL b){
LL ans=;
while(b){
if(b&) ans=(ans*a)%Mod;
a=(a*a)%Mod;
b>>=;
}
return ans;
} int main(){
init();
scanf("%d",&T);
while(T--){
LL n,k;
scanf("%lld%lld",&n,&k);
printf("%lld\n",f1[k]*(qpow(k+,n-k)-qpow(k,n-k)+1LL*Mod)%Mod);
}
return ;
}

poj3761(反序表)的更多相关文章

  1. 找一个四位数,要求该四位数的四倍刚好是该四位数的反序。 即b1b2b3b4 * 4 = b4b3b2b1

    找一个四位数,要求该四位数的四倍刚好是该四位数的反序. 即b1b2b3b4 * 4 = b4b3b2b1 解: 第一步,确认最末位 假设 b1b2b3b4 + b4b3b2b1 = [x0]x1x2x ...

  2. Django的列表反序

    Django虽然是python的web框架,但它不是所有的python特性都支持的. 最近在项目中遇到一个问题,需要在Django中将获得的列表反序排列,一开始我使用的是python的reverse方 ...

  3. leetcode:Reverse Integer(一个整数反序输出)

    Question:Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 ...

  4. SQL自连接(源于推荐算法中的反查表问题)

    ”基于用户的协同过滤算法“是推荐算法的一种,这类算法强调的是:把和你有相似爱好的其他的用户的物品推荐给你. 要实现该推荐算法,就需要计算和你有交集的用户,这就要用到物品到用户的反查表. 先举个例子说明 ...

  5. pojg2744找一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。

    http://poj.grids.cn/practice/2744 描述现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是 ...

  6. 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)

    目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...

  7. 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。

    namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...

  8. Excel反序排列

    实际工作中有这样一个需求,将Excel列表中所有的条目进行反序排列,有人说这还不简单直接选中某一列按照这列排序(升序或降序)就可以了. 但问题是这里没有可以参考的列,进行排序. 比如: 想转换为: 那 ...

  9. SortedDictionary<TKey,TValue>正序与反序排序及Dicttionary相关

    SortedDictionary<TKey,TValue>能对字典排序 using System; using System.Collections.Generic; using Syst ...

随机推荐

  1. Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist

    题目 papyrus 喜欢谜题... 来解一道如何? 在你面前有一个被加密了的数组,其原数组是一个等差序列,你面前的则是将原数组中的所有数字都对m 取模再打乱后而得到的新数组 papyrus 给你出的 ...

  2. C# Stopwatch 延时

    using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading ...

  3. plsql 连不上64位oracle客户端

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...

  4. linux系统装机分区

  5. QTCreator:QSS语法高亮(QSS Syntax highlight)

    由于QSS几乎等同CSS[1]语法,所以我们设置有 QT 语法高亮: Qtcreator QSS syntax highlight setting: Qt Creator QSS 语法交互设置:QTC ...

  6. CSS的五种基本选择器

    要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. ㈠什么是选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/co ...

  7. jquery attribute选择器 语法

    jquery attribute选择器 语法 作用:[attribute] 选择每个带有指定属性的元素.可以选取带有任何属性的元素(对于指定的属性没有限制). 语法:$("[attribut ...

  8. luoguP3353 在你窗外闪耀的星星

    P3353 在你窗外闪耀的星星 题目描述 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向 ...

  9. Hexo + github pages + 阿里云绑定域名搭建个人博客

    申请域名 万网购买的域名,地址:https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.137.LoKzy7 控制台进行解析 控制台 ...

  10. js 获取系统时间:年月日 星期 时分秒(动态)

    最近再写一个纯html页面,有时间和天气的数据,天气后台给接口,时间要自己获取,我就自己弄了下, <div class="basic"></div> 这是放 ...