[康托展开]luogu P1384 幸运数与排列
时间:2020-10-21
本文章向大家介绍[康托展开]luogu P1384 幸运数与排列,主要包括[康托展开]luogu P1384 幸运数与排列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题面
https://www.luogu.com.cn/problem/P1384
分析
康托展开,即$k=a_n*(n-1)!+a_{n-1}*(n-2)!+\dot \dot \dot +a_1*0!$,$a_i$ 表示第i位上的数在尚未出现的元素中的排名
这题对k做逆康托展开还原序列前13位即可(13!已经大于最大值了,剩余部分不会变)然后统计不变部分的幸运数个数,对于变化的部分单独求在幸运数位置上的幸运数个数。
由于康托展开是一种类似数位DP的定理,所以也可以归类这题为数位DP
代码
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int N=2e6+10; int cnt,ncnt,c; ll n,k,fact[21],pow[10],l[N],need[21],num[21],rev[21],ans; void Get_Lucky(int dep,ll x) { if (x+pow[dep]*4<=n) Get_Lucky(dep+1,l[++cnt]=x+pow[dep]*4); if (x+pow[dep]*7<=n) Get_Lucky(dep+1,l[++cnt]=x+pow[dep]*7); } bool Lucky(ll x) {for (;x;x/=10) if (x%10!=4&&x%10!=7) return 0;return 1;} int main() { scanf("%lld%lld",&n,&k);k--; fact[0]=1;for (int i=1;i<=20;i++) fact[i]=fact[i-1]*i; pow[0]=1;for (int i=1;i<10;i++) pow[i]=pow[i-1]*10; if (n<=12&&fact[n]<=k) return printf("-1"),0; Get_Lucky(0,0);sort(l+1,l+cnt+1); if (cnt==0) return printf("0"),0; for (c=20;c&&fact[c]>k;c--); for (int i=cnt;l[i]>=n-c;i--) need[++ncnt]=l[i]; for (int i=n-c;i<=n;i++) num[i-n+c+1]=i; for (int i=1,j=c;j;j--,i++) { rev[i]=num[k/fact[j]+1]; for (int r=k/fact[j]+1;r<=j;r++) num[r]=num[r+1]; k%=fact[j]; } rev[c+1]=num[1]; for (int i=1;i<=ncnt;i++) if (Lucky(rev[need[i]-n+c+1])) ans++; printf("%lld",ans+cnt-ncnt); }
原文地址:https://www.cnblogs.com/mastervan/p/13855154.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 支付业务优化else if 代码
- 在UBUNTU虚拟机上安装R软件包
- R语言逻辑回归和泊松回归模型对发生交通事故概率建模
- 万恶的NPE差点让我半个月工资没了
- R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- 大白话java多线程,高手勿入
- R语言小数定律的保险业应用:泊松分布模拟索赔次数
- R语言中自编基尼系数的CART回归决策树的实现
- ArrayList的删除姿势你都掌握了吗
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- 10分钟带你入门git到github
- 微服务[学成在线] day18:基于oauth2实现RBAC认证授权、微服务间认证实现
- 【TBase开源版测评】分布式事务全局一致性
- R语言进阶之主成分分析