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次查询,查询 ...
随机推荐
- 解决异地服务器接口访问跨域,node构建反向代理
跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...
- CentOS6.5安装Elasticsearch1.7.5
1. 首页到官方网站下载最新安装包 https://www.elastic.co/downloads/elasticsearch elasticsearch-1.7.5.tar.gz 2. 将软件包 ...
- Github Issues
快捷键r
- Python Shell 中敲击方向键显示「^[[C^[[D],问题解决
碰到问题后,在网上搜索. 有帖子建议:yum install -y ncurses-devel,我这个2.7.13版本的在Linux下不行.估计是解决python3.x的方案. 尝试网上建议的,装了 ...
- cocos2d JS 中的数组拼接与排序
var arrA = [];//创建三个局部变量的新数组 var arrB = []; var arrC = []; var newCards = this.MyMahjong;//创建一个新的局部变 ...
- C#学习入门第一篇
1. using System; using System.Collections.Generic; using System.Ling; using System.Text; using Syste ...
- c#中的模态对话框和非模态对话框
模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...
- c#如何判断字符串是否含中文
如代码: static bool ContainChinese(string input) { string pattern = "[\u4e00-\u9fbb]"; return ...
- 前端-CSS样式
一.CSS介绍 CSS(Cascading Style Sheet),全称层叠样式,定义如何显示HTML内的元素,浏览器读取HTML文件时,读取到CSS样式时根据CSS规则来对内容进行渲染 1.CSS ...
- 将n的k位s置1
实例四:将n的k位s置1 方法:result =n|(1<<k) 只使k位变为1,其他位为0,再进行或操作,1与任何数的或操作都是1. 解释: 原数 0000 1011 ---11 数值1 ...