P1384 幸运数与排列

神奇的(逆)康托展开:求1到n的全排列中字典序第k小的排列

$k<=10^9<13!$,显然$k$最多只会影响后$13$位

前面一大串都是有序从小到大排列的,于是搞个数位dp

后面一小串用逆康托展开求出原串,枚举是否符合条件。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
long long fac[]={,,,,,,,,,,,,,};
int n,k,x,e[],a[];
vector <int> p1,p2;
int dfs(int d,int w,int z){//普通的数位dp
if(!d) return !z;
if(!w&&!z&&e[d]>-) return e[d];
int lim=w?a[d]:,tot=;
for(int i=;i<=lim;++i)
if(i==||i==||(z&&!i))
tot+=dfs(d-,w&&(i==lim),z&&!i);
if(!w&&!z) e[d]=tot;
return tot;
}
int solve1(int A){
int t=;
while(A) a[++t]=A%,A/=;
return dfs(t,,);
}
bool is(int x){
for(;x;x/=) if(x%!=&&x%!=) return ;
return ;
}
int solve2(){
--k;
for(int i=n-x+;i<=n;++i) p1.push_back(i);
for(int i=x,v;i>=;--i){//逆康托展开求原串
v=k/fac[i-]; k%=fac[i-];
sort(p1.begin(),p1.end());
p2.push_back(p1[v]);
p1.erase(p1.begin()+v);
}int tot=;
for(int i=;i<x;++i)
if(is(n-x+i+)&&is(p2[i])) ++tot;
return tot;
}
int main(){
scanf("%d%d",&n,&k);
if(n<&&k>fac[n]){printf("-1");return ;}
while(k>fac[x])++x;
memset(e,-,sizeof(e));
printf("%d",solve1(n-x)+solve2());
return ;
}

P1384 幸运数与排列的更多相关文章

  1. pongo英雄会-幸运数题解

    显然我们只要知道1~x范围有多少幸运数(用f(x)表示),lucky(x,y)=f(y)-f(x-1). 解法1. 计算排列数 由于y<=1000000000这个规模,我们不能暴力验证每个数是否 ...

  2. 京东2017校园招聘笔试题 【第K个幸运数】

    题目描述 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字. 前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第 ...

  3. [COJ0528]BJOI幸运数

    [COJ0528]BJOI幸运数 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试 ...

  4. [51NOD1230]幸运数(数位DP)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1230 dp(l,s,ss)表示长度为l的数各位和为s,各位平方 ...

  5. Problem 1007 幸运数 线段树成段更新

    题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...

  6. Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和

    晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...

  7. 蓝桥杯  历届试题 幸运数  dfs

    历届试题 幸运数 时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...

  8. C. cltt的幸运数LCAtarjan

    /*C: cltt的幸运数 Time Limit: 1 s      Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...

  9. C. cltt的幸运数LCAdfs

    /*C: cltt的幸运数 Time Limit: 1 s      Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...

随机推荐

  1. ssh tunnel 三种模式

    环境介绍: 主机 位置 公网 内网IP 角色 host-a 局域网1 否 192.168.0.1 ssh client host-b 局域网2.公网 是 192.168.1.1 ssh server ...

  2. jenkins 实现多用户同时触发任务 + 修改job的config.xml 不重启服务生效

    (后期添加: 这篇博客是在刚研究并发构建时写的,所以方法比较老套,采用的时流水线(pipeline)的方式,实现时通过如果job的用户配置来创建多个新的执行任务的job,并且将执行日志回收到入口job ...

  3. 百度云同同步盘 mac版

    百度云同步盘

  4. 海量数据找相同数,高配词,不重复的数,判断一个数是否存在,查询串,不同电话号码的个数,中位数,按照query频度排序,topk

    这类题目,首先需要确定可用内存的大小,然后确定数据的大小,由这两个参数就可以确定hash函数应该怎么设置才能保证每个文件的大小都不超过内存的大小,从而可以保证每个小的文件都能被一次性加载到内存中. 1 ...

  5. 包含mysql 递归查询父节点 和子节点

    包含mysql 递归查询父节点 和子节点 mysql递归查询,查父集合,查子集合 查子集合 --drop FUNCTION `getChildList` CREATE FUNCTION `getChi ...

  6. Selenium基础知识(五)多窗口切换

    说到多窗口切换必须想到driver.switch_to.window()方法 driver.switch_to.window() 实现在不同窗口之间切换 driver.current_window_h ...

  7. 答案在哪里?action config/Interceptor/class/servlet

    项目已提测,这两天我们都集中精力梳理外包团队给我司研发的这个三方支付系统的代码逻辑.今天下午爱琴海会议室,开发组里一同学分享他对支付结果回调的梳理成果. 支付结果回调的整体时序是:支付渠道方处理完用户 ...

  8. vss使用笔记

    一.四大代码/文档管理软件 (1)     git:具有PR(push request)特性,推送请求.需要负责人审核后才能推送.另外,在推送过程中,git会预编译(合并),分布式代码管理(客户端本地 ...

  9. keras如何求分类问题中的准确率和召回率

    https://www.zhihu.com/question/53294625 由于要用keras做一个多分类的问题,评价标准采用precision,recall,和f1_score:但是keras中 ...

  10. 【Hadoop学习之四】HDFS HA搭建(QJM)

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 由于NameNode对于整个HDF ...