URAL 2052 Physical Education(数位DP)
题目链接: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)的更多相关文章
- ural 1057Amount of Degrees ——数位DP
link:http://acm.timus.ru/problem.aspx?space=1&num=1057 论文: 浅谈数位类统计问题 刘聪 #include <iostream&g ...
- ural 1057(数位dp)
数位dp题,关键是用树的思维去考虑. 对于一个数字X,要是能表示成K个B的不同次幂,等价于X在B进制下有且只有K个位上面的数字为一,其他位上的数字都为0. 具体读者可以去参考,国家集训队李聪的论文,里 ...
- URAL 1057 数位dp
题目传送门http://acm.timus.ru/problem.aspx?space=1&num=1057 最近在学习数位dp,具体姿势可以参照这篇论文:http://wenku.baidu ...
- [DP]数位DP总结
数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step http://blog.csdn.net/dslovemz/article/details/ ...
- [转]数位dp小记
转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/ ...
- 【学时总结】 ◆学时·IV◆ 数位DP
[学时·IV] 数位DP ■基本策略■ 说白了就是超时和不超时的区别 :) 有一些特别的题与数位有关,但是用一般的枚举算法会超时.这时候就有人提出了--我们可以用动态规划!通过数字前一位和后一位之间的 ...
- 以前刷过的数位dp
TOJ1688: Round Numbers Description The cows, as you know, have no fingers or thumbs and thus are una ...
- 数位DP 计划
通常的数位dp可以写成如下形式: [cpp] view plain copy int dfs(int i, int s, bool e) { if (i==-1) return s==target_s ...
- Ural1057. Amount of Degrees 题解 数位DP
题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...
随机推荐
- pytorch安装问题
目录 1.版本 2.pytorch调试中出现的Module 'torch' has no 'zero' member如何解决 3.No module named 'numpy.core._multia ...
- C++11 thread condition_variable mutex 综合使用
#include <mutex> #include <condition_variable> #include <chrono> #include <thre ...
- Android5以后WebView闪退问题
Android4.4开发项目中的webview在Android各个版本运行的飞起,可是项目升级,最低版本适配5.0之后,webview各种闪退问题 真让人头大!!!!!!!!!!!!!!! 啊啊啊啊啊 ...
- IT学习的计算机网络内容
1.一种结构:数据结构 参考书目:<大话数据结构>.<数据结构(C#语言描述)>.<剑指Offer> ①线性表部分: 线性表(上){ 数组.ArrayList } ...
- 2.2注册中心:Eureka
pom.xml配置 <?xml version="1.0" encoding="UTF-8"?><project xmlns="ht ...
- 使用JavaScript随机生成数字混合字母的验证码
<script> // 封装一个随机生成数字的函数 function random(a, b) { var n = Math.round(Math.random() * (a - b) ...
- idea 如何加入插件SonarLint
idea 如何加入插件SonarLint IDEA的插件安装有两种方法:一是在线安装:二是离线安装,即将插件的安装包下载以后从本地安装. 一.在线安装的过程: 1.打开IDEA ...
- Python 【格式化字符串】
print('血量:'+str(player_life)+' 攻击:'+str(player_attack)) 第一种格式化字符串 print('血量:%s 攻击:%s' % (player_life ...
- WPF DataGrid控件中某一列根据另一个文本列的值显示相应的模板控件
之前做项目的时候需要实现这样一个功能.WPF DataGrid有两列,一列为"更新状态”列,一列为"值"列,如果"更新状态"列的值为“固定值更新”,则 ...
- HDR10 中的名词解释
1. EOTF ( Electro-Optical Transfer Function ),电->光 转换函数.由电信号,转换成光信号时的规则.确定显示终端(电视机.投影仪等),如何合理地响应输 ...