Codeforces-121C(逆康托展开)
题目大意:
给你两个数n,k求n的全排列的第k小,有多少满足如下条件的数:
首先定义一个幸运数字:只由4和7构成
对于排列p[i]满足i和p[i]都是幸运数字
思路:
对于n,k<=1e9
一眼逆康托展开
什么?你不知到康托展开?
由于阶乘的增长是非常快的
13的阶乘就大于1e9了
所以说:
对于一个n的权排列 1 2 3 4 ...... n
我们最多动他的后13位就可以得到第k小的排列
我们称之为动n的后x位可以得到第k小的排列(如果这里都取13的话,有的序列是n<13的,会越界)
然后我们对[1,n-x]中的数字统计答案的时候可以数位dp,可以dfs
然后对后x位统计答案,就是裸的逆康托展开了
Code:
ll n, k, x, fac[20], ans;
std::vector<ll> v;
ll suf[20], cnt;
void dfs(ll num, ll top)
{
// cout<<top<<endl;
if(num > top) return ;
if(num <= top && num != 0)ans++;
dfs(num * 10 + 4, top);
dfs(num * 10 + 7, top);
}
int ok(ll x)
{
int flag = 1;
while(x)
{
int yy = x % 10;
// cout<<yy<<"@"<<endl;
if(yy != 4 && yy != 7) flag = 0;
x /= 10;
}
return flag;
}
void re_count()
{
sort(v.begin(), v.end());
for(int i = x ; i >= 1 ; i--)
{
ll pos = k / fac[i - 1];
k = k % fac[i - 1];
suf[++cnt] = v[pos];
v.erase(v.begin() + pos);
} }
int main()
{
fac[0] = 1;
rep(i, 1, 16) fac[i] = i * fac[i - 1];
n = read(), k = read();
k--;
for(int i = 1 ; i <= 16; i++)
{
if(fac[i] >k)
{
x = i;
break;
}
}
// cout<<x<<"#"<<endl;
for(int i = n; i >= n - x + 1; i--) v.push_back(i);
if(n - x < 0)
{
cout << -1;
return 0;
}
dfs(0, n - x); //搜出n-x的幸运数
re_count();
for(int i = n - x + 1; i <= n; i++) if(ok(i) && ok(suf[i - (n - x)])) ans++;
out(ans);
return 0;
}
Codeforces-121C(逆康托展开)的更多相关文章
- LightOJ1060 nth Permutation(不重复全排列+逆康托展开)
一年多前遇到差不多的题目http://acm.fafu.edu.cn/problem.php?id=1427. 一开始我还用搜索..后来那时意外找到一个不重复全排列的计算公式:M!/(N1!*N2!* ...
- nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开
讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...
- 题解报告:NYOJ 题目143 第几是谁?(逆康托展开)
描述 现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的.但是现在我们给出它是第几小,需要你求出它所代表的序列. ...
- HDU1027 Ignatius and the Princess II( 逆康托展开 )
链接:传送门 题意:给出一个 n ,求 1 - n 全排列的第 m 个排列情况 思路:经典逆康托展开,需要注意的时要在原来逆康托展开的模板上改动一些地方. 分析:已知 1 <= M <= ...
- 康托展开&逆康托展开学习笔记
啊...好久没写了...可能是最后一篇学习笔记了吧 题目大意:给定序列求其在全排列中的排名&&给定排名求排列. 这就是康托展开&&逆康托展开要干的事了.下面依次介绍 一 ...
- hdoj 1027 Ignatius and the Princess II 【逆康托展开】
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- 康托展开与逆康托展开模板(O(n^2)/O(nlogn))
O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } in ...
- DeCantor Expansion (逆康托展开)
Background\text{Background}Background The \text{The }The Listen&Say Test will be hold on May 11, ...
- cf121C. Lucky Permutation(康托展开)
题意 题目链接 Sol 由于阶乘的数量增长非常迅速,而\(k\)又非常小,那么显然最后的序列只有最后几位会发生改变. 前面的位置都是\(i = a[i]\).那么前面的可以直接数位dp/爆搜,后面的部 ...
随机推荐
- Redis 大 key 问题 & 问题分析 & 解决方案
Redis 大 key 问题 & 问题分析 & 解决方案 Redis 什么是 Redis 大 key 单个key 存储的 value 很大 hash, set,zset,list 结构 ...
- Typescript All In One
Typescript All In One TypeScript 3.5 is now available. https://www.typescriptlang.org/#download-link ...
- react fiber
react fiber https://github.com/acdlite/react-fiber-architecture https://github.com/facebook/react/is ...
- 灰度发布 & A/B 测试
灰度发布 & A/B 测试 http://www.woshipm.com/pmd/573429.html 8 https://testerhome.com/topics/15746 scree ...
- TYLER ADAMS BRADBERRY:人到中年,要学会戒掉这三点
在一些国家的一些人当中,总会出现这样一个问题"中年危机".而到了中年,人与人间的差距似乎也变得越来越大.有人说,人到中年,是一个门槛,有的人迈过去了,有的人没迈过去.但是,其实实话 ...
- 关于PCA主成分分析的一点理解
PCA 即主成分分析技术,旨在利用降维的思想,把多指标转化为少数几个综合指标. 假设目前我们的数据特征为3,即数据维度为三,现在我们想将数据降维为二维,一维: 我们之前的数据其实就是三维空间中的一个个 ...
- 后端程序员之路 43、Redis list
Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...
- AntDesign Pro + .NET Core 实现基于JWT的登录认证
很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做 ...
- 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...
- CCF(地铁修建):向前星+dijikstra+求a到b所有路径中最长边中的最小值
地铁修建 201703-4 这题就是最短路的一种变形,不是求两点之间的最短路,而是求所有路径中的最长边的最小值. 这里还是使用d数组,但是定义不同了,这里的d[i]就是表示从起点到i的路径中最长边中的 ...