题目链接:https://vjudge.net/contest/254142#problem/G

参考题解:https://blog.csdn.net/zearot/article/details/47984379

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define LL __int128
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 2e6 + ;
const ll mod = 1e9 + ; int f[][], dig[]; void init() {
mst(f, );
f[][] = ;
for(int i = ; i <= ; i++)
for(int j = ; j <= i * ; j++)
for(int k = ; k <= min(, j); k++)
f[i][j] += f[i - ][j - k];
} int findall(int pos,int sum,bool limit) {
if(!limit || !pos) return f[pos][sum];
int ans = , mx = min(dig[pos], sum);
for(int i = ; i <= mx; i++)
ans += findall(pos - ,sum - i,limit && i == dig[pos]);
return ans;
} int shu[]; void findd(int pos,int sum,int rnk,bool limit) {
if(!pos) return ;
if(!limit) {
int mx = min(, sum);
for(int i = ; i <= mx; i++) {
if(f[pos - ][sum - i] < rnk) rnk -= f[pos - ][sum - i];
else {
shu[pos] = i;
findd(pos - ,sum - i,rnk,limit);
return ;
}
}
} else {
int mx = min(dig[pos], sum);
for(int i = ; i <= mx; i++) {
int temp = findall(pos - ,sum - i,i == dig[pos]);
if(temp < rnk) rnk -= temp;
else {
shu[pos] = i;
findd(pos - ,sum - i,rnk,i == dig[pos]);
return ;
}
}
}
} int main()
{
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
init();
int n,len = ;
scanf("%d",&n);
while(n) {
dig[++len] = n % ;
n /= ;
}
int ans = ,sum = ;
for(int i = ; i <= len * ; i++) {
int num = findall(len,i,true);
if(!num) continue;
int l = , r = num, num1;
bool flag = false;
while(l <= r) {
int mid = (l + r) >> ;
findd(len,i,mid,true);
num1 = ;
for(int j = len; j >= ; j--) {
if(!num1 && !shu[j]) continue;
num1 = num1 * + shu[j];
}
if(sum + mid > num1) l = mid + ;
else if(sum + mid < num1) r = mid - ;
else {
flag = true;
break;
}
}
if(flag) ans++;
sum += num;
}
printf("%d\n",ans);
return ;
}

URAL 2052 Physical Education(数位DP)的更多相关文章

  1. ural 1057Amount of Degrees ——数位DP

    link:http://acm.timus.ru/problem.aspx?space=1&num=1057 论文: 浅谈数位类统计问题  刘聪 #include <iostream&g ...

  2. ural 1057(数位dp)

    数位dp题,关键是用树的思维去考虑. 对于一个数字X,要是能表示成K个B的不同次幂,等价于X在B进制下有且只有K个位上面的数字为一,其他位上的数字都为0. 具体读者可以去参考,国家集训队李聪的论文,里 ...

  3. URAL 1057 数位dp

    题目传送门http://acm.timus.ru/problem.aspx?space=1&num=1057 最近在学习数位dp,具体姿势可以参照这篇论文:http://wenku.baidu ...

  4. [DP]数位DP总结

     数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step   http://blog.csdn.net/dslovemz/article/details/ ...

  5. [转]数位dp小记

    转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/ ...

  6. 【学时总结】 ◆学时·IV◆ 数位DP

    [学时·IV] 数位DP ■基本策略■ 说白了就是超时和不超时的区别 :) 有一些特别的题与数位有关,但是用一般的枚举算法会超时.这时候就有人提出了--我们可以用动态规划!通过数字前一位和后一位之间的 ...

  7. 以前刷过的数位dp

    TOJ1688: Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are una ...

  8. 数位DP 计划

    通常的数位dp可以写成如下形式: [cpp] view plain copy int dfs(int i, int s, bool e) { if (i==-1) return s==target_s ...

  9. Ural1057. Amount of Degrees 题解 数位DP

    题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...

随机推荐

  1. jdk1.8 -- Collectors 的使用

    package com.collector; import java.util.ArrayList; import java.util.Arrays; import java.util.Collect ...

  2. cdoj 574 High-level ancients dfs序+线段树 每个点所加权值不同

    High-level ancients Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/s ...

  3. 第一次安装Dev-c++编译器如何设置?Dev-c++神奇功能

    安装完Dev-c++后,我们通常会根据自己的喜好调整设置,以下是个人的做法,欢迎参考. 1.字体 字体在安装界面就可以更改.默认字体是consolas,个人喜欢下面的courier new 有些字体很 ...

  4. COGS 2633. [HZOI 2016] 数列操作e

    [题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作, 1 L R x,给区间[L,R]内,第一个数加x,第二个数加2^2⋅x,第三个数加3^2⋅x...第R-L+1个 ...

  5. 散列查找的C实现

    概念 散列查找,类似与查英文字典的过程.如果我们要查找"zoo"(key)对应的释义(value),我们不会从第一页开始逐页查找(顺序查找),而是直接根据大致的推算(Hash函数) ...

  6. 【Python基础】04_Python中的if判断语句

    1.if基本语法 if 要判断的条件:     条件成立时,要做的事情     ...... 注:代码缩进为一个 tab 键,或者4个空格 ——建议使用空格 if语句和缩进部分是一个完整的代码块 2. ...

  7. java 内部类、匿名内部类

    一:内部类 1:什么是内部类? 大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类(有些地方也叫做嵌套类),包含内部类的 ...

  8. 2、wepy安装后提示Cannot read property 'addDeps' 参考自https://www.cnblogs.com/yuanchaoyong/p/11614400.html

    摘抄自https://www.cnblogs.com/yuanchaoyong/p/11614400.html wepy安装步骤 $ npm install @wepy/cli -g # 全局安装 W ...

  9. gitlab 搭建

     一.ubuntu搭建gitlab     1. 如果以前有安装过gitlab请根据以下步骤来删除 https://www.cnblogs.com/shansongxian/p/6678110.htm ...

  10. 一些常见css样式加选择器

    先来个下拉框: 例: select是下拉框标签 multiple:指多选项 size :显示的选项数量 selected="selected":默认选中 —————————分割线— ...