[ZJOJ] 5772【NOIP2008模拟】今天你AK了吗
Description
AK:All kill
“你为什么没背书?”
“没有为什么,我就是没背书。”
“……我去年买了个表,G—U—N!”
头铁王InFleaKing把背书的时间都拿去列排列了......
n=3的排列一共有六个(顺序按字典序从小到大):
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
气不打一处来的InFleaKing把n的排列打乱了。
他想知道字典序第k小的n的排列是什么?
由于InFleaKing被捉去背书了,所以这个问题只能交给被万人顶礼膜拜的dalao您来解决了。
Input
一行,两个数,分别是n,k。
n,k的含义见题目描述。
Output
一行,n个数。
代表字典序第k小的n的排列。
注意两两数之间要用空格隔开。
Sample Input
Sample Input1:
1 1
Sample Input2:
2 2
Sample Output
Sample Output1:
1
Sample Output2:
2 1
Data Constraint
【数据约定】
对于10%的数据:1<=n<=3
对于20%的数据,1<=n<=9
对于30%的数据:1<=n<=18,1<=k<=10^6
对于60%的数据:1<=n<=18
对于80%的数据:1<=n<=100,1<=k<=10^100
对于90%的数据:1<=n<=1000,1<=k<=10^1000
对于100%的数据:1<=n<=100000,1<=k<=min(10^20000,n!)
思路解析
无力吐槽。
如果想恶心我的话成功了。
根据惯例,我们面向数据编程。
第一档
对于10%的数据:1<=n<=3
手算 + 打表
预期分数:10
第二档
对于30%的数据:1<=n<=18,1<=k<=10^6手算 + 打表还是可以
直接暴力递归求解。
预期分数:20 ~ 30
第三档
对于60%的数据:1<=n<=18
要不要听一个看上去很高级的洋玩意叫康托展开?
这个题听说是逆康托展开。没兴趣讲,请自行baidu
说一下我的想法
因为是输出字典序,我姑且列出所有情况看一下吧
以4 6这组数据为例
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
........
可以找出一个规律:
第一位数是当前1~4中没用过的第k/6大的数
第二位是当前1~4中没用过的第k/2大的数
6 = 3!
2 = 2!
好了,写代码吧
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const long long sum[] = {,,,,,,,,,,,,,,,,,,};
long long n,k;
bool vis[];
inline void find_kth(long long x) {
long long res = ;
long long i;
for(i = ;i <= n;i++) {
if(!vis[i]) res++;
if(res == x) break;
}
printf("%lld ",i);
vis[i] = ;
}
int main() {
freopen("array.in","r",stdin);
freopen("array.out","w",stdout);
scanf("%lld%lld",&n,&k);
long long now,tmp,cnt,x;
now = k;
cnt = n;
while(cnt--) {
tmp = now / sum[cnt];
x = now;
now = now % sum[cnt];
if(!now) now = sum[cnt];
if(tmp * sum[cnt] < x) tmp++;
find_kth(tmp);
}
return ;
}
第四档
对于90%的数据:1<=n<=1000,1<=k<=10^1000
高精不解释
每次的商是小于n的,所以可以二分商涉及到高精度减法,高精度乘法,还算好打。
一次的复杂度是O(n log n)
总复杂度O(n^2 log n)
预期分数:70~90
第五档
对于100%的数据:1<=n<=100000,1<=k<=min(10^20000,n!)
以下引自作者的题解》》
k<=10^20000
我可以很负责任的告诉你:6100!>10^20000,但是我们的n却有10^5那么大。
这说明什么?
这说明前100000-6100=93900个数一定是1、2、3、…、93900(你发现了
吗?)
因此只需要O(6100^2)的复杂度来完成这个部分。
即使你不会数据结构或者分块也可以解决这道题!
假数据范围
预计分数:90~100(需要常数优化)
总结
考场不要写高精,除非你时间充裕
[ZJOJ] 5772【NOIP2008模拟】今天你AK了吗的更多相关文章
- JZOJ 5777. 【NOIP2008模拟】小x玩游戏
5777. [NOIP2008模拟]小x玩游戏 (File IO): input:game.in output:game.out Time Limits: 1000 ms Memory Limits ...
- JZOJ 5809. 【NOIP2008模拟】数羊
5809. [NOIP2008模拟]数羊 (File IO): input:sheep.in output:sheep.out Time Limits: 1000 ms Memory Limits: ...
- JZOJ 5793. 【NOIP2008模拟】小S练跑步
5793. [NOIP2008模拟]小S练跑步 (File IO): input:run.in output:run.out Time Limits: 2000 ms Memory Limits: ...
- JZOJ 5791. 【NOIP2008模拟】阶乘
5791. [NOIP2008模拟]阶乘 (File IO): input:factorial.in output:factorial.out Time Limits: 1000 ms Memory ...
- JZOJ 5776. 【NOIP2008模拟】小x游世界树
5776. [NOIP2008模拟]小x游世界树 (File IO): input:yggdrasil.in output:yggdrasil.out Time Limits: 1500 ms Me ...
- JZOJ 5775. 【NOIP2008模拟】农夫约的假期
5775. [NOIP2008模拟]农夫约的假期 (File IO): input:shuru.in output:shuru.out Time Limits: 1000 ms Memory Lim ...
- JZOJ 5773. 【NOIP2008模拟】简单数学题
5773. [NOIP2008模拟]简单数学题 (File IO): input:math.in output:math.out Time Limits: 1000 ms Memory Limits ...
- JZOJ 5771. 【NOIP2008模拟】遨游
5771. [NOIP2008模拟]遨游 (File IO): input:trip.in output:trip.out Time Limits: 2000 ms Memory Limits: 2 ...
- JZOJ5776. 【NOIP2008模拟】小x游世界树
题目:[NOIP2008模拟]小x游世界树: 题目的附加题解给的很清楚,这里只给一个代码: #include<iostream> #include<cstdio> #inclu ...
随机推荐
- Centos 7 nginx-1.12.0 配置学习(一)
[root@bogon nginx]# vim nginx.conf #user nobody; #运行用户 worker_processes ; #启动进程,通常设置成和cpu核心数相等 #全局错误 ...
- linux (debian) 配置静态ip
在局域网内使用动态ip分配,机器动态的获取 ip地址.可是我使用ssh登录的时候.总是断线. 后来发现,原来机器总是在两个ip地址192.168.2.203 和192.168.2.228之间切换.用s ...
- Java 实现简答的单链表的功能
作者:林子木 博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...
- 【转】webview的几个问题
我们在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方 ...
- 预编译头文件pch
1. 预编译头文件 作用:提高编译效率.预编译头文件(扩展名为.PCH),是为了提高编译效率而使用的一种方法,把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.避免每次编译 ...
- bzoj2780
AC自动机+树链剖分+线段树/树状数组+dfs序+树链的并 题意:给出n个母串和q个询问串,对于每个询问串输出有多少个母串包含这个询问串 N=∑|母串|<=10^5 Q=∑|询问串|<=3 ...
- ubuntu16.04 Flume 安装
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...
- ajax接收处理json格式数据
ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...
- IT架构师介绍-软件架构设计学习第一天(非原创)
文章大纲 一.架构师定义二.架构师分类与具备能力三.研发人员发展的技术路线四.架构师知识体系五.参考文章 一.架构师定义 什么是架构师,这个聊架构话题时永恒的问题.每个公司对架构师的定位也有所 ...
- T4模板使用记录,生成Model、Service、Repository
自己目前在搭建一个.NET Core的框架,本来是打算使用前端做代码生成器直接生成到文件的,快做好了.感觉好像使用T4更方便一些,所以也就有了这篇文章~ 我还是有个问题没解决,就是我想生成每个类(接 ...