BZOJ 3131 [SDOI2013]淘金 - 数位DP
Solution
这道数位$DP$看的我很懵逼啊。。。
首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到。
然后我们考虑算出有多少的$x$ 使得$f(x) = y$, 并记录个数到$ans[y]$ 中。
然后? 然后我就不会啦QAQ
定义数组$f[ i ][ j ][ k ]$ , $i$ 表示 $i$位数字, $j$ 表示 所有位上的数乘起来为 $b[j]$ , $k$ 表示前 $i$ 位是否比 $N$的前$i$位大。
因为当$i = len$ 时, 是不允许比$N$大的, 所以$k$仅可能等于 $0 $
然后就有转移方程 $f[ i + 1][ nxt ][ (k + x) > a[i + 1]] += f[i][j][k]$
算出$f$ 数组后, 相应地转移进 $ans[]$中, 最后进行排序,并用大根堆维护 、 取出
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stdlib.h>
using namespace std;
typedef long long ll; const int N = 1e6;
const ll mod = 1e9 + ; int tot, len, a[], k;
ll b[N], f[][][], ans[N], n, maxn; struct node {
int x, y; ll val;
node(int a, int b) {
x = a; y = b;
val = ans[a] * ans[b];
}
bool operator < (const node &b) const {
return val < b.val;
}
bool operator > (const node &b) const {
return val > b.val;
}
}; priority_queue<node> q; ll fpow(ll a, ll b) {
ll re = ;
for(; b; b >>= , a = a * a)
if(b & ) re = re * a;
return re;
} void dfs(int dep, ll sum, int rest) {
b[++tot] = sum;
if(dep > ) return;
if(!rest) return;
for(int i = ; i <= rest; ++i)
dfs(dep + , sum * fpow(dep, i), rest - i);
} int fd(ll x) {
return lower_bound(b + , b + + tot, x) - b;
} bool cmp(ll x, ll y) {
return x > y;
} int main()
{
scanf("%lld%d", &n, &k);
while(n) {
a[++len] = n % ;
n /= ;
}
b[++tot] = ;
dfs(, , len);
sort(b + , b + + tot);
tot = unique(b + , b + + tot) - b - ;
b[tot + ] = 0x7fffffff;
f[][][] = ;
// for(int i = tot; i >= tot - 10; --i)
// printf("%lld\n", b[i]);
for(int i = ; i <= len; ++i)
for(int j = ; j <= tot; ++j)
for(int k = ; k < ; ++k)
if(f[i][j][k])
for(int x = (i == )? : ; x < ; ++x) {
int nxt = lower_bound(b + , b + + tot, b[j] * x) - b;
f[i + ][nxt][(k + x) > a[i + ]] += f[i][j][k];
}
for(int i = ; i <= tot; ++i) {
for(int j = ; j < len; ++j)
ans[i] += f[j][i][] + f[j][i][];
ans[i] += f[len][i][];
}
sort(ans + , ans + + tot, cmp);
// for(int i = 1; i <= 10; ++i)
// printf("%lld\n", ans[i]);
q.push(node(, ));
while(!q.empty() && k) {
node now = q.top(); q.pop();
maxn = (maxn + now.val) % mod;
if(!(--k)) break;
if(now.x != now.y) {
maxn = (maxn + now.val) % mod;
if(!(--k)) break;
q.push(node(now.x + , now.y));
}
if(now.x == ) q.push(node(now.x, now.y + ));
}
maxn = (maxn % mod + mod) % mod;
printf("%lld\n", maxn);
}
BZOJ 3131 [SDOI2013]淘金 - 数位DP的更多相关文章
- Bzoj 3131 [Sdoi2013]淘金 题解
3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 733 Solved: 363[Submit][Status][ ...
- bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)
Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹 ...
- bzoj 3131 [Sdoi2013]淘金(数位dp)
题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...
- [SDOI2013]淘金 数位DP
做了好久.... 大致思路: 求出前k大的方格之和即为答案, 先考虑一维的情况,设f[i]为数位上各个数相乘为i的数的总数,也就是对于数i,有f[i]个数它们各个位相乘为i, 再拓展到二维,根据乘法原 ...
- bozoj3131: [Sdoi2013]淘金 数位dp
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3131 思路 1. 函数值的素因子只有2.3.5.7 由他们组成的状态不多,爆搜的时候即使搜不 ...
- bzoj 3131: [Sdoi2013]淘金
#include<cstdio> #include<iostream> #include<queue> #include<algorithm> #def ...
- BZOJ 3652: 大新闻(数位DP+概率论)
不得不说数位DP和博弈论根本不熟啊QAQ,首先这道题嘛~~~可以分成两个子问题: 有加密:直接算出0~n中二进制每一位为0或为1分别有多少个,然后分位累加求和就行了= = 无加密:分别算出0~n中二进 ...
- BZOJ 1833 数字计数 数位DP
题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...
- BZOJ 4521 [CQOI2016]手机号码 - 数位DP
Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...
随机推荐
- 内存占用过高 kill 调整mysql内存占用
通过 /var/log/messages 查看 被系统kill掉的进程 如果是自己崩溃会产生 hs_err_ 修改mysql my.cnf innodb_buffer_pool_siz ...
- spring .cloud ------------java.lang.RuntimeException: com.netflix.client.ClientException,Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters
1.问题的发生 Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connect ...
- R各种数据类型的转换
1.列表转化为数据框 df <- data.frame(matrix(unlist(列表), nrow=132, byrow=T),stringsAsFactors=FALSE)
- frame嵌套页面元素的定位
这里当出现页面嵌套的时候怎么定位?frame就是对于嵌套页面的定位,今天具体说一下 前期准备工作:先编写一个HTML网页,带有嵌套的,方便我们在案例中使用按照如下截图的代码编写就好了,然后保存为HTM ...
- Linux中systemctl命令详细介绍
Linux Systemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syst ...
- 常用的jquerymobil 站点
http://www.jqmapi.com/api1.2/ Jquery Mobile 中文API站 https://codiqa.com/demo jquerymobil UI编辑器 https ...
- CentOS 下环境变量
1. 显示环境变量HOME(不要把一个#号输进去了,#代表用户名) # echo #HOME /home/redbooks 2. 设置一个新的环境变量hello # export HELLO=&quo ...
- LibreOJ 6282. 数列分块入门 6
题目链接:https://loj.ac/problem/6282 参考博客:http://www.cnblogs.com/stxy-ferryman/p/8560551.html 这里如果用数组的话元 ...
- Jmeter cookie不兼容问题
历史脚本,今天准备执行测试,报出这种错误 解决方案:HTTP Cookie Manager里的 Cookie Policy 由rfc2109设置为兼容模式(Compatibility) 参考:http ...
- ACM-ICPC 2018 南京赛区网络预赛 L.Magical Girl Haze(分层最短路)
There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a di ...