题目链接

题目描述

给定一个长度为n的排列,要求输出该排列的字典序名次(1,2,3,...,n的名次为1)。

输入输出格式

输入格式:

第一行一个数n,表示排列长度。

第二行n个数,用空格分隔,表示一个长度为n的排列。

输出格式:

一个数,表示该排列的字典序名次。由于答案可能很大,请输出答案对1e9+7取模后的结果。

输入输出样例

输入样例#1:

9
9 8 7 6 5 4 3 1 2
输出样例#1:

362879

说明

对于30%的数据,n<=10。

对于100%的数据,n<=100000。

题解:

30分做法:纯暴力。枚举名次从1至n!的排列,并与给定排列相比较。复杂度O(n!)。

100分做法:类康托展开。

下面进入精彩的猜结论推理时间:

以排列5 9 7 6 8 1 4 3 2为例,第一个数字是5,在5之前还有1,2,3,4,一共4个数字没有用过,脑中模拟暴力过程推理可知以5开头的第一个排列的序号应为1+4*8!。第二个数字是9,在9之前还有1,2,3,4,6,7,8,一共7个数字没有用过,同理可知以59开头的第一个排列的序号为1+4*8!+7*7!。如此递推下去即可得到给定排列的序号。

所以本题需要预处理出1至n的阶乘,还需要得知排列中第i个数之后有多少个数比自己小。这个可以用树状数组维护前缀和得到:初始时每个元素都是1,处理至排列a时查询sum(a[i]-1),然后add(a[i],-1)即可。

预处理O(n),依次处理每个元素为O(n),每次处理时sum和add操作为O(logn),总复杂度O(nlogn)。

代码:

#include<bits/stdc++.h>
#define LL long long
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=1e5+10,MOD=1e9+7;
int a[maxn],c[maxn];
LL fac[maxn],ans=1;
int n;
void add(int x,int d)
{
   int i;
   for(i=x;i<=n;i+=lowbit(i)){c[i]+=d;}
}
int sum(int x)
{
   int i,ans=0;
   for(i=x;i>=1;i-=lowbit(i)){ans+=c[i];}
   return ans;
}
int main()
{
   int i,j;LL tmp;
   //freopen("data9.in","r",stdin);
   //freopen("data9.out","w",stdout);
   cin>>n;fac[0]=1;
   for(i=1;i<=n;i++){fac[i]=i*fac[i-1]%MOD;add(i,1);}
   for(i=1;i<=n;i++){scanf("%d",&a[i]);}
   //for(i=0;i<=n;i++){cout<<sum(i)<<" ";}cout<<endl;
   for(i=1;i<=n;i++)
   {
      tmp=sum(a[i]-1)*fac[n-i]%MOD;
      //printf("i=%d sum(a[i]-1)=%d fac[n-i]=%d tmp=%d ans=%d\n",i,sum(a[i]-1),fac[n-i],tmp,ans);
      ans=(ans+tmp)%MOD;
      add(a[i],-1);
   }
   cout<<ans<<endl;
   return 0;
}

Luogu T10025 排列名次的更多相关文章

  1. iframe的优缺点

    HTML框架简述   一个浏览器窗体可以通过几个页面的组合来显示.我们可以使用框架来完成(frames)这项工作.(框架可以把HTML文档分为多个页面)   框架页使用了表格的方式组合,可以分为数行与 ...

  2. Frameset框架优缺点--来自新浪微博

    原文地址:http://blog.sina.com.cn/s/blog_4a4b1b010100p6ro.html HTML框架简述   一个浏览器窗体可以通过几个页面的组合来显示.我们可以使用框架来 ...

  3. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)

    How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...

  4. 大话SEO网站优化|SEO优化入门技术详解

    网络营销 网络营销是借助一切被目标用户认可的网络应用服务平台开展的引导用户关注的行为或活动,目的是促进产品在线销售及扩大品牌影响力. web1.0时代有搜索引擎营销.BBS营销.邮件营销.病毒式营销. ...

  5. luogu P4448 [AHOI2018初中组]球球的排列

    这道题我一上来只会80 还是要感谢题解区大佬题解的帮助 先考虑若\(xy,xz\)为完全平方数,则\(yz\)也为完全平方数,因为\(xy*xz=x^2yz\)为完全平方数,除掉\(x^2\)就行了 ...

  6. luogu P4437 [HNOI/AHOI2018]排列

    luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...

  7. LUOGU P4163 [SCOI2007]排列

    传送门 解题思路 首先我们发现这道题s的长度很小,所以考虑点暴力的做法,状压dp或搜索.本蒟蒻搜索永远调不对,所以就写了个状压dp.因为所有s里的数都要出现一次,并且最后的答案是要求整除,那么我们设d ...

  8. Luogu P4071 [SDOI2016]排列计数

    晚上XZTdalao给我推荐了这道数论题.太棒了又可以A一道省选题了 其实这道题也就考一个错排公式+组合数+乘法逆元 我们来一步一步分析 错排公式 通俗的说就是把n个1~n的数排成一个序列A,并使得所 ...

  9. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. Java 中 Executors.newSingleThreadExecutor() 与Executors.newFixedThreadPool(1)有什么区别

    在研究Executors提供的线程池时自然会想到标题这个问题,既然已经有了newFixedThreadPool,为什么还要存在newSingleThreadExecutor这个方法.难道newFixe ...

  2. Eplan P8 2.7 加密狗 感叹号 解决方法

    Eplan安装完加密狗后一直感叹号异常,最近也是查了很多办法,最后发现是少了个驱动的原因. 就是上面这个驱动,这里放上驱动链接:https://lanzous.com/id5gi8f ,或者随便找一个 ...

  3. JavaScript入门-函数function(二)

    JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...

  4. MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)

    数据准备 数据表 CREATE TABLE `teacher`( id INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY ( ...

  5. docker 创建数据卷容器

    数据卷容器 --volumes-from 容器名/id 先起一个容器 docker run -it --name docker01 centos 然后同步 docker01 的数据卷 --volume ...

  6. 【ORA】ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode

    ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode 这个问题是rman备份的时候,发现有问题 原因: 数据库没有开启归档 ...

  7. 【EXPDP】导出全部表的时候,选择不导出某个表

    导出的时候指定某一张表不导出的话,一般都用的是数据泵的expdp来操作 具体方法是: expdp test/test dumpfile=test.dmp directory=test_dir excl ...

  8. ctfhub技能树—信息泄露—svn泄露

    打开靶机 查看页面信息 使用dvcs-ripper工具进行处理 ./rip-svn.pl -v -u http://challenge-3b6d43d72718eefb.sandbox.ctfhub. ...

  9. 使用axis1.4生成webservice的客户端代码

    webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...

  10. Linux更换软件源

    1. Ubuntu16.04 sudo cp /etc/apt/sources.list /etc/apt/sources_origin.list # 备份 sudo gedit /etc/apt/s ...