nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】
正题
题目大意
求n个数的全排列的第k个。
解题思路
首先康拓逆展开
∑ii<=nxi(n−i)!\sum^{i<=n}_i x_i(n-i)!∑ii<=nxi(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<=nxi(n−i)!\sum^{i<=n}_i x_i(n-i)!∑ii<=nxi(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了吗?【康托展开,高精度,二分答案,树状数组】相关推荐
- 【GDOI2003】排列的编码 {康托展开+高精度}
题目 Description 对于n个元素的排列P=(p1,p2,--,pn),请你编写一个程序,在不构造出所有排列的情况下,直接输出该排列在按字典序排列的字典中的序数d§,其中p1∈{1,2,3,- ...
- [洛谷P5367]【模板】康托展开
题目大意:给定一个$n$的排列,求它在$n$的全排列中的名次 题解:康托展开,对于一个全排列,第$i$为有$n+1-i$种选择,用变进制数表示,这一位就是$n+1-i$进制.记排列中第$[1,i)$中 ...
- 大一c语言知识点总结树状图,AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点!...
原标题:AK宝典丨哟,写bug呐?19级数据结构满分dalao在线帮你划重点! 这是 北航士谔书院的第 1482篇推送 经过寒假的预习 你一定对 春季学期的课程 有了十足的底气和信心了吧? 你心目中最 ...
- AK F.*ing leetcode 流浪计划之线段树
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 文章目录 零.简介 一.算法原理 树的构建 更新 查询 二.数据结构及算法实现 数据结构 构建 更新 查询 复杂度分析 例题题解 ...
- (康托展开解释)+ NYOJ 139 我排第几个
描述 现在有"abcdefghijkl"12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? 输入 第一行有一个整数n(0<n& ...
- 康托展开(Cantor expansion)
康托展开是一个全排列到一个自然数的双射.所以可逆. 康托展开:给定一个数n,和一个n位的全排列,求出这个排列是第几位X 逆康托展开:给定一个数n,和这个排列占第几位X, 求出这个排列 这里X(注意第一 ...
- 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)
http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
- 关于数论【康托展开及其逆运算】
表示这个东西背了很多次,但是次次忘,希望这次能够记住吧. 康托展开: 问45231是n=5的全排列中第几个排列? ans:= 3*4! + 3*3! + 1*2! + 1*1! + 0*0! =93 ...
最新文章
- 前端基础知识 - 收藏集 - 掘金
- Hdu-6249 2017CCPC-Final G.Alice’s Stamps 动态规划
- 【学术相关】刚刚,中科院最新预警期刊名单发布!
- serv-u无法自动启动:无法开始服务器!服务器执行缺少
- LeetCode 1066. 校园自行车分配 II(状态压缩DP)
- Windows 11 来了!无缝支持安卓 App界面却像极了macOS
- linux c curl 乱码,curl获取结果乱码的解决方法之CURLOPT_ENCODING(curl/Post请求)
- UVA 10572 Black White
- JSP实现点击链接后下载文件(相当于右键另存)功能
- 父类构造函数与子类构造函数的关系
- python发送多人邮件没有展示收件人问题的解决方法
- marshmallow——Nested 类型
- 巨杉数据库SequoiaDB协调节点
- 【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法
- 云的基本概念(公有云、私有云、 IaaS、PaaS、SaaS)
- 学习笔记:直面配分函数(待完善)
- Bootstrap 与 Jackknife 笔记
- 我在VsCode上看基金,你呢?
- SQL - 单引号和双引号的区别
- java 用折半查找,java折半查找算法
热门文章
- 创维linux进入工厂模式,创维电视怎么进入工厂模式?
- vue 给取data值_web前端教程分享Vue相关面试题
- java 8 排序_一遍记住 8 种排序算法与 Java 代码实现
- linux 装nano命令,linux下安装 nano 如果没有这个命令的话~~可以看下
- mysql80重置密码_MySQL8.0修改密码问题
- mysql 大小写 if_【已解决】Windows下 MySQL大小写敏感 解决方案及分析
- js map对象遍历_前端测试题:有关于js中跨域请求的说法,错误的是?
- php用ajaxs上传图片_jquery+ajax+php 图片上传
- 用python画树_Python+Turtle动态绘制一棵树实例分享
- java读取整数列表_Java-检查整数列表中的X类整数