正题


题目大意

求n个数的全排列的第k个。


解题思路

首先康拓逆展开
∑ii&lt;=nxi(n−i)!\sum^{i&lt;=n}_i x_i(n-i)!∑ii<=n​xi​(n−i)!
求每个时候第xxx大的数
然后因为n(n−1)!=n!n(n-1)!=n!n(n−1)!=n!
so我们可以直接用余数

这是n=3n=3n=3时是序列,我们可以发现我们需要求第xix_ixi​个。这时候我们可以用二分加树状数组来log2log^2log2的求答案。
之后我们又会发现
∑ii&lt;=nxi(n−i)!\sum^{i&lt;=n}_i x_i(n-i)!∑ii<=n​xi​(n−i)!
这个直接计算时间复杂度是n2log2nwn^2\ log^2n\ wn2 log2n w(w是高进度位数)。
这时我们引入:
x%yz/z=x/z%yx\%yz/z=x/z\%yx%yz/z=x/z%y
证明:

这时候我们可以枚举1∼n1\sim n1∼n,然后每次kmodik\ mod\ ik mod i,这时候的余数就是上面式子n−i+1n-i+1n−i+1次的余数。


code

#include<iostream>
#include<cstring>
#define lobit(x) x&-x
#define N 100010
#define ll long long
using namespace std;
ll a[N*2],n,t[N],l,mo[N];
char k[N*2];
void change(ll x,ll num)//改变
{while(x<=n){t[x]+=num;x+=lobit(x);}
}
ll ask(ll x)//询问
{ll sum=0;while(x){sum+=t[x];x-=lobit(x);}return sum;
}
void read()//输入——高精度
{scanf("%s",k);l=strlen(k)-1;ll L=0;for(ll i=l;i>=0;i--) L+=((l-i)%13)==0,mo[i]=L-1;//压行之后的位置for(ll i=0;i<=l;i++) a[mo[i]]=a[mo[i]]*10+k[i]-48;//求值a[0]--;for(ll i=0;i<=l;i++) if(a[i]<0) a[i+1]--,a[i]+=(1e13);//要先-1l=L-1;
}
ll div(ll x)//高精除
{   ll g=0;for (ll i=l;i>=0;i--){ll s;s=g*(1e13)+a[i];a[i]=s/x;g=s%x;}while(!a[l]) l--;return g;
}
int main()
{scanf("%lld",&n);read();for(ll i=1;i<=n;i++)mo[n-i+1]=div(i);//计算余数for(ll i=1;i<=n;i++) {ll ans=0;for(ll l=1,r=n;l<=r;) {ll m=(l+r)/2;ll s=0,x=m;s=x-ask(x);if(s<=mo[i]) l=m+1;else ans=m,r=m-1;}//二分位置ll x=ans;change(x,1);//去掉这个数printf("%lld ",ans);}return 0;
}

nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】相关推荐

  1. 【GDOI2003】排列的编码 {康托展开+高精度}

    题目 Description 对于n个元素的排列P=(p1,p2,--,pn),请你编写一个程序,在不构造出所有排列的情况下,直接输出该排列在按字典序排列的字典中的序数d§,其中p1∈{1,2,3,- ...

  2. [洛谷P5367]【模板】康托展开

    题目大意:给定一个$n$的排列,求它在$n$的全排列中的名次 题解:康托展开,对于一个全排列,第$i$为有$n+1-i$种选择,用变进制数表示,这一位就是$n+1-i$进制.记排列中第$[1,i)$中 ...

  3. 大一c语言知识点总结树状图,AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点!...

    原标题:AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点! 这是 北航士谔书院的第 1482篇推送 经过寒假的预习 你一定对 春季学期的课程 有了十足的底气和信心了吧? 你心目中最 ...

  4. AK F.*ing leetcode 流浪计划之线段树

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 文章目录 零.简介 一.算法原理 树的构建 更新 查询 二.数据结构及算法实现 数据结构 构建 更新 查询 复杂度分析 例题题解 ...

  5. (康托展开解释)+ NYOJ 139 我排第几个

    描述 现在有"abcdefghijkl"12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? 输入 第一行有一个整数n(0<n& ...

  6. 康托展开(Cantor expansion)

    康托展开是一个全排列到一个自然数的双射.所以可逆. 康托展开:给定一个数n,和一个n位的全排列,求出这个排列是第几位X 逆康托展开:给定一个数n,和这个排列占第几位X, 求出这个排列 这里X(注意第一 ...

  7. 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...

  8. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

  9. 关于数论【康托展开及其逆运算】

    表示这个东西背了很多次,但是次次忘,希望这次能够记住吧. 康托展开: 问45231是n=5的全排列中第几个排列? ans:= 3*4! + 3*3! + 1*2! + 1*1! + 0*0! =93 ...

最新文章

  1. 前端基础知识 - 收藏集 - 掘金
  2. Hdu-6249 2017CCPC-Final G.Alice’s Stamps 动态规划
  3. 【学术相关】刚刚,中科院最新预警期刊名单发布!
  4. serv-u无法自动启动:无法开始服务器!服务器执行缺少
  5. LeetCode 1066. 校园自行车分配 II(状态压缩DP)
  6. Windows 11 来了!无缝支持安卓 App界面却像极了macOS
  7. linux c curl 乱码,curl获取结果乱码的解决方法之CURLOPT_ENCODING(curl/Post请求)
  8. UVA 10572 Black White
  9. JSP实现点击链接后下载文件(相当于右键另存)功能
  10. 父类构造函数与子类构造函数的关系
  11. python发送多人邮件没有展示收件人问题的解决方法
  12. marshmallow——Nested 类型
  13. 巨杉数据库SequoiaDB协调节点
  14. 【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法
  15. 云的基本概念(公有云、私有云、 IaaS、PaaS、SaaS)
  16. 学习笔记:直面配分函数(待完善)
  17. Bootstrap 与 Jackknife 笔记
  18. 我在VsCode上看基金,你呢?
  19. SQL - 单引号和双引号的区别
  20. java 用折半查找,java折半查找算法

热门文章

  1. 创维linux进入工厂模式,创维电视怎么进入工厂模式?
  2. vue 给取data值_web前端教程分享Vue相关面试题
  3. java 8 排序_一遍记住 8 种排序算法与 Java 代码实现
  4. linux 装nano命令,linux下安装 nano 如果没有这个命令的话~~可以看下
  5. mysql80重置密码_MySQL8.0修改密码问题
  6. mysql 大小写 if_【已解决】Windows下 MySQL大小写敏感 解决方案及分析
  7. js map对象遍历_前端测试题:有关于js中跨域请求的说法,错误的是?
  8. php用ajaxs上传图片_jquery+ajax+php 图片上传
  9. 用python画树_Python+Turtle动态绘制一棵树实例分享
  10. java读取整数列表_Java-检查整数列表中的X类整数