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 幸运数与排列的更多相关文章
- pongo英雄会-幸运数题解
显然我们只要知道1~x范围有多少幸运数(用f(x)表示),lucky(x,y)=f(y)-f(x-1). 解法1. 计算排列数 由于y<=1000000000这个规模,我们不能暴力验证每个数是否 ...
- 京东2017校园招聘笔试题 【第K个幸运数】
题目描述 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字. 前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第 ...
- [COJ0528]BJOI幸运数
[COJ0528]BJOI幸运数 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试 ...
- [51NOD1230]幸运数(数位DP)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1230 dp(l,s,ss)表示长度为l的数各位和为s,各位平方 ...
- Problem 1007 幸运数 线段树成段更新
题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...
- Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和
晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...
- 蓝桥杯 历届试题 幸运数 dfs
历届试题 幸运数 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2, ...
- C. cltt的幸运数LCAtarjan
/*C: cltt的幸运数 Time Limit: 1 s Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...
- C. cltt的幸运数LCAdfs
/*C: cltt的幸运数 Time Limit: 1 s Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...
随机推荐
- 解决bug感觉
解决bug,没有思路,很烦躁: 时间过去好久,还是没头绪,没结论: ...... ...... ...... ...... ...... 过了好久,这样还不如冷静下来,按照正确的方法(review代码 ...
- [LeetCode] 129. Sum Root to Leaf Numbers_Medium tag: DFS
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...
- MongoDB--搭建mongodb服务器
此为手动搭建: 可以看到初始化data时所有的数据,和log里已经有日志文件
- Go断后,Dart冲前,Google的野心
今天,我要讲讲新的前端web语言-Dart 我是网上看到这段话,激起了兴趣,虽然我不能算是真正的web前端从业者!哈哈 [ Dart语言由谷歌制造,用来替代Javascript,弥补Javascrip ...
- NPOI设置单元格格式
转自:http://www.cr173.com/html/18143_2.html //创建一个常用的xls文件 private void button3_Click(object sender, E ...
- 用log4net记录日志信息
在.net中用log4net记录日志信息,已经是很平常的事情了. log4net下载:http://logging.apache.org/log4net/download_log4net.cgi 百度 ...
- CentOS双机中Docker下安装Mysql并配置互为主从模式
CentOS双机中Docker下安装Mysql并配置互为主从模式 目录 1.搜索镜像... 1 2.拉取镜像... 1 3.绑定端口: 1 4.配置文件(修改/etc/mysql/my.cnf文件): ...
- unity之复制文本到剪贴板
代码如下: static void CopyString(string str) { TextEditor te = new TextEditor(); te.text = str; te.Selec ...
- tcl脚本
tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...
- Attention Is All You Need 一些好的资料
The encoders are all identical in structure (yet they do not share weights). Each one is broken down ...