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 ...
随机推荐
- 基于DBMS_METADATA.GET_DDL函数批量导出索引的创建语句
/* 首先要说的DBMS_METADATA.GET_DDL是个好函数呀!新项目不知道哪个缺心眼建的同构库,只是见了表结构,并没有健非主键外的索引,领导让追加一版,以前只是会用视图拼sql创建,今天有学 ...
- 关于Linux操作系统中的一些易忘记的命令与作用
1.改变文件或文件夹的权限,例如:chmod options mode file :[ugoa...] [+-=] [rwxXstugo],其中字符的含义如下: 第一组[ugoa...]:文件(夹)权 ...
- Codeforces contest 1277 E. Beautiful Rectangle
- 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- Java手写简单Linkedlist一(包括增加,插入,查找,toString,remove功能)
@Java300 学习总结 一.自定义节点 LinkList底层为双向链表.特点为查询效率低,但增删效率高,线程不安全. 链表数据储存在节点,且每个节点有指向上个和下个节点的指针. 创建ggLinke ...
- 【leetcode】74. 搜索二维矩阵
题目链接:传送门 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 ...
- Python 线程&进程与协程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Oracle导入数据后中文乱码的解决方法
解决方法: 方法一. 1.在运行命令行输入regedit,打开注册表编辑器 2.找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1 3.看N ...
- javascript数字格式化通用类——accounting.js使用
简介 accounting.js 是一个非常小的JavaScript方法库用于对数字,金额和货币进行格式化.并提供可选的Excel风格列渲染.它没有依赖任何JS框架.货币符号等可以按需求进行定制. 代 ...
- editormd 富文本编辑器转 html
// html <div id="markdown-view"> <textarea id="markdownView" style=&quo ...