51Nod-1635-第K个幸运排列
来源:互联网 发布:js设置p标签的值 编辑:程序博客网 时间:2024/05/09 10:56
ACM模版
描述
题解
分成如上两部分后,前部分肯定是顺序排列,所以我们可以利用数位
涨姿势了……第一次使用逆康托展开,很强势。
代码
#include <iostream>using namespace std;typedef long long ll;const int MAXN = 15;const int MAX_FAC = 14;const int MAX_POW = 33;const int MAGIC_4 = 4;const int MAGIC_7 = 7;ll n, k;int num[MAXN];ll pow[MAX_POW];ll fac[MAX_FAC];// 数位 DP,求 1~x 有多少幸运数字ll dp(ll x){ if (x == 0) { return 0; } int pos = 0; while (x) { num[++pos] = x % 10; x /= 10; } ll res = 0; for (int i = pos; i >= 1; i--) { if (num[i] > MAGIC_7) { res += pow[i]; break; } else if (num[i] == MAGIC_7) { res += pow[i - 1]; if (i == 1) { res++; } } else if (num[i] > MAGIC_4) { res += pow[i - 1]; break; } else if (num[i] == MAGIC_4) { if (i == 1) { res++; } } else if (num[i] < MAGIC_4) { break; } } for (int i = 1; i < pos; i++) { res += pow[i]; } return res;}bool vis[MAXN];ll s[MAXN];void reverse_cantor(ll n, ll k, ll base){ --k; for (int i = 0, j; i < n; i++) { ll t = k / fac[n - i - 1]; for (j = 1; j <= n; j++) { if (!vis[j]) { if (t == 0) { break; } --t; } } s[i] = j + base; vis[j] = true; k %= fac[n - i - 1]; }}bool check(ll n){ if (n == 0) { return false; } while (n > 0) { if (n % 10 != MAGIC_4 && n % 10 != MAGIC_7) { return false; } n /= 10; } return true;}void init(){ fac[0] = pow[0] = 1; for (int i = 1; i < MAX_FAC; i++) { fac[i] = fac[i - 1] * i; } for (int i = 1; i < MAX_POW; i++) { pow[i] = pow[i - 1] * 2; }}int main(){ init(); scanf("%lld%lld", &n, &k); if (n < MAX_FAC && fac[n] < k) { puts("-1"); return 0; } int cnt = 1; while (fac[cnt] < k) { cnt++; } ll pos = n - cnt, sta = pos + 1; ll ans = dp(pos); reverse_cantor(cnt, k, pos); for (ll i = sta; i <= n; i++) { if (check(i) && check(s[i - sta])) { ans++; } } printf("%lld\n", ans); return 0;}
阅读全文
0 0
- 51nod 1635 第K个幸运排列
- 51Nod-1635-第K个幸运排列
- 第K个幸运数
- 第k个幸运数字
- 第K个幸运数
- 第k个排列
- 查找第K个幸运数字
- 第k个排列数
- LintCode-第k个排列
- LinkCode 第k个排列
- 第k个排列-LintCode
- lintcode-第k个排列-388
- hdu1027 求第k个全排列
- 第k个字典序全排列
- LINTCODE——第k个排列
- Permutation Sequence 排列序列-第K个排列
- [LeetCode] k-th permutation 第k个排列
- 排列哈希、反哈希(求一个排列是所有排列中的第K个排列)
- RecyclerView baseadapter
- 从头开始搭建一个dubbo+zookeeper平台
- Java反射机制
- Android Fragment使用小结及介绍
- Java总结 1104/1105
- 51Nod-1635-第K个幸运排列
- 三分钟教你读懂汇票是什么
- vs2015配置Opencv3.3.1
- 单例模式
- 6.8
- c语言笔记_2017年11月9日
- 关于const和volatile
- Linux学习 [3] Shell使用基础
- hihocoder 1032(manacher)