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. 15个Node.js项目列表

    前言: Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台,是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascri ...

  2. 25-Python3 错误和异常

    25-Python3 错误和异常 ''' 语法错误 ''' # while True print('hello,runoob') ''' 异常 ''' ##ZeroDivisionError # pr ...

  3. Hadoop2.6的DataNode启动不了

    2016-05-04 18:14:51,990 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting 2016-05-04 ...

  4. svn回复历史版本的操作方法

    svn恢复历史版本的操作方法svn update 保证最新svn log login.php 获得版本号svn diff -r 11026:11027 login.php 发现11027出问题svn ...

  5. EntityFrameworkCore概览

    .NET Core 中 EntityFrameworkCore的支持库主要有: Script-migration 级联删除 protected override void OnConfiguring( ...

  6. WCF&AppFabric :异常消息: 内存入口检查失败

    bug描述 发件人信息: System.ServiceModel.ServiceHostingEnvironment+HostingManager/31242459 异常: System.Servic ...

  7. Python解决乱码问题

    解决python乱码问题 字符串在python的内部采用unicode的编码方式,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode ...

  8. MyBatis基础入门《四》接口方式.Select查询集合

    MyBatis基础入门<四>接口方式.Select查询集合 描述: 在<MyBatis基础入门<二>Select查询>中有说过,SQLSession有两种用法,这里 ...

  9. JavaScript原型规则和实例

    var arr = [] // var arr = new Array() var obj = {} // var obj = new Object() function fn() {} // var ...

  10. java基础练习

    String str = "Nothing is impossible to a willing heart"; String str2 = "No cross, no ...