51nod1635 第K个幸运排列
比得喜欢幸运数字。这里所说的幸运数字是由4和7组成的正整数。比如,整数47,744,4是幸运数字,而5,17,467就不是。
一天比得梦到由数字1到n组成的第K个字典序排列。要求计算在这个排列中有多少个幸运数所在的位置的编号也是幸运数。
举例如下:
比如排列[1,2,3,4],其中4为幸运数,它所在的位置的下标为4(幸运数),所在此排列中,结果为1.
又如,[1,2,4,3],4所在位置为3。3不是幸运数,所以,结果为0.
排列是由n个元素组成的一个序列,在这个序列中,整数1到n都要有且仅出现一次。
在排列中,第i个元素定义为 ai (1≤i≤n)。
假定有排列a,和排列b。长度均为n。即都是由1到n组成。如果存在i(1≤i≤n)和对于任意j(1≤j<i)使得 ai < bi 且 aj = bj 。我们就说,a的字典序比b的字典序小。
对1到n组成的所有排列进行字典序升序排列。然后取其中的第K个排列,就是第K个字典序排列。
在样例中,最终排列如下:
1 2 3 4 6 7 5
只有第4个位置是幸运数。
单组测试数据 共一行,包含两个整数n和k(1≤n,k≤10^9)表示排列中的元素个数,和第K个字典序排列。
如果k超过出了1到n所有排列数的种数,那么输出“-1”(没有引号)。 否则,输出题目要求结果。
7 4
1
题解:切成两部分考虑,因为k很小,所以前半部分是连续的1~x直接统计即可,后面直接暴力(只有13个不确定的数)
然后判断即可(有点恶心)
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,a[100],f[100],g[100],n1;
long long pd(long long t){long long n1=0;while(t){n1++;a[n1]=t%10;t/=10;if(a[n1]!=4&&a[n1]!=7)return 0;}return 1;
}
void dfs(long long x){if(x>n1)return;if(x)ans++;dfs(x*10+4);dfs(x*10+7);
}
int main(){long long i,ii,j,t,k,s,la;scanf("%lld%lld",&n,&m);t=1;for(i=2;i<=n;i++){if(t>m)break;t*=i;la=i;}if(t<m){printf("-1");return 0;}ii=la;k=t;for(i=1;i<=ii;i++){g[i]=1;}for(i=n-ii+1;i<=n;i++){k/=(ii-(i-(n-ii+1)));s=0;for(j=1;j<=ii;j++)if(g[j]){s++;if(s*k>=m){m-=(s-1)*k;g[j]=0;f[i-(n-ii)]=j+(n-ii);break;} }}n1=n-ii;dfs(0);for(i=1;i<=ii;i++)if(pd(f[i])&&pd(n-ii+i))ans++; printf("%lld\n",ans);
}
51nod1635 第K个幸运排列相关推荐
- 第K个幸运排列 (51Nod-1635)
题目 比得喜欢幸运数字.这里所说的幸运数字是由4和7组成的正整数.比如,整数47,744,4是幸运数字,而5,17,467就不是. 一天比得梦到由数字1到n组成的第K个字典序排列.要求计算在这个排列中 ...
- 求第K个幸运数字(只由4、7或者他们的组合构成的数称为幸运数字)
记录一道没见过的题[幸运数字] 1. 题目描述 如题,只由4和7或者他们的组合构成的数字称为幸运数字,这个列表按照从小到达排序. 求第K个数是多少. 示例1: 输入:k = 5 输出:74 说明K很大 ...
- 组合数学 —— 康托展开
[概述] 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩,在组合数学中,其解决的是当前排列在全排列中的名次问题. 简单来说,给定一个 n 位数的全排列,可根据康托展开公式确定其应 ...
- LeetCode 60. 第k个排列(python、c++)
题目描述 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "1 ...
- 632. Smallest Range Covering Elements from K Lists 最小区间
你有 k 个升序排列的整数数组.找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中. 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区 ...
- php 实现的字典序排列算法,字典序的一个生成算法
字典序的一个生成算法. 最近在LeetCode刷题,刷到一个题,链接: https://leetcode-cn.com/problems/permutation-sequence/ 这个题要求得长度为 ...
- 获取字符串全排列 或者 只输出k个的组合
已知长度为n的字符串,获取所有可能的全排序 n! def test(arr):length = len(arr)if length<=1:return arrres = []for i in r ...
- 输出排列 递归、回溯法
前缀List[0...k-1], 后缀为list[k..m] (没有前缀)从第0个元素开始,起始位置list[0] 与list[0...n-1] 这N个元素交换位置,确定第0位的元素 前缀list[ ...
- python 幸运数代码
对于一个数字,如果它各个位数相加的和,等于在二进制下其各个位数相加的和,就称其为幸运数. 例如123,各个位数相加是6:123在二进制下是1111011,各个位数相加是6,因此123是幸运数. 现在对 ...
最新文章
- android 开发环境简书,Android Studio 开发环境快速搭建
- html复选框多行排列布局
- Silverlight WCF RIA服务(二十七)Silverlight 客户端 8
- js面向对象之创建对象1
- NetCat Tutorials
- 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...
- 用JavaScript怎么写Windows的状态栏
- sketch文件导出没有背景色怎么办? sketch背景色消失的解决办法
- Google Chrome 所有版本下载
- vrep中的运动规划(主要是针对机械臂)(未完)
- JAVA退房计算价格怎么写,JAVA宾馆客房管理系统报告.doc
- Python手机App数据抓取实战:抖音用户的抓取
- 怎么知道网站是否被黑 服务器是否被入侵呢
- 电子产品“使用”和“放置”哪个寿命更长??
- Microsoft visual studio安装2013
- 如何修改MySQL监听IP地址
- python skimage 填补图像孔洞
- 常用的ddos防护方式
- Oracle中joint,什么是关节中心化(Joint centration)?
- μTorrent 3.2.1 关闭广告