[bzoj3131]淘金[sdoi2013][数位DP]
求出每个数i可以被转移到的数目$f[i]$,则点$(i,j)$中的金子数目为$f[i]*f[j]$,我们就可以用优先队列求解前$k$大。
首先所有的积数目在$10^4$左右,可以先Dfs搜索出所有的数值,然后离散化。
设$f[i][j][k]$表示i位数,积为$j$(离散),当前枚举位是否小于$n$的第$i$位,枚举第$i+1$位数转移即可。
$f[i][j][k] \longrightarrow f[i+1][num[j]*x][(k+x)>a[i+1]]$
用$g[i]$表示乘积$i$的种类数
【学习】http://www.cnblogs.com/lidaxin/p/5234975.html
#include <bits/stdc++.h> using namespace std; const long long MOD=1e9+; long long a[],Len;
long long f[][][],g[];
long long n,K;
vector<long long> vec; struct cmp
{
bool operator()(const pair<long long,long long> temp1,
const pair<long long,long long> temp2)
{
return (long long)g[temp1.first]*g[temp1.second]<
(long long)g[temp2.first]*g[temp2.second];
}
}; void Init()
{ long long temp=n; while(temp) { a[++Len]=temp%; temp/=; } return ; } void Dfs(const long long cur,const long long step,const long long mul)
{
vec.push_back(mul); if(step==Len)return ;
for(long long i=cur;i<=;++i) Dfs(i,step+,mul*i);
return ;
} int main()
{
scanf("%lld%lld",&n,&K); //INIT mul->vec_____________________________________________________
Init(); Dfs(,,);
//------------------------------------------------------------------ vec.push_back(); sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end()); //Dp start Hear_____________________________________________________
f[][][]=;
for(long long i=;i<=Len;++i)
for(long long j=;j<(long long)vec.size();++j)
for(long long k=;k<=;++k)
{
if(f[i][j][k]) for(long long x=i==?:;x<=;++x)
//Zero is allowed at the beginning only if len=1
{
long long temp=
lower_bound(vec.begin(),vec.end(),vec[j]*x)-
vec.begin();
f[i+][temp][(k+x)>a[i+]]+=f[i][j][k];
}
}
//------------------------------------------------------------------ //Calc g[i]_________________________________________________________
for(long long i=;i<(long long)vec.size();++i)
{
for(long long j=;j<=Len-;++j)
g[i]+=f[j][i][]+f[j][i][]; g[i]+=f[Len][i][]; //Not to exceed N
}
//------------------------------------------------------------------ //Get_Ans_with_Priority_Queue_______________________________________
long long Ans=; typedef pair<long long,long long> PII;
priority_queue<PII,vector<PII>,cmp>Q; sort(g,g+vec.size(),greater<long long>());
Q.push(make_pair(,)); while(!Q.empty() && K)
{
pair<long long,long long> t=Q.top(); Q.pop(); Ans=(Ans+g[t.first]*g[t.second])%MOD;
if(!(--K)) break; if(t.first!=t.second)
{
Ans=(Ans+g[t.first]*g[t.second])%MOD; if(!(--K)) break;
Q.push(make_pair(t.first+,t.second));
} if(t.first==) Q.push(make_pair(t.first,t.second+));//QAQ
}
//------------------------------------------------------------------ printf("%lld\n",Ans);
return ;
}
[bzoj3131]淘金[sdoi2013][数位DP]的更多相关文章
- [Bzoj3131][Sdoi2013]淘金(数位dp)(优先队列)
3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 847 Solved: 423[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块. 一阵风吹过,金子的位置发生了 ...
- [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)
只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...
- BZOJ 3131 [SDOI2013]淘金 - 数位DP
传送门 Solution 这道数位$DP$看的我很懵逼啊... 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到. 然后我们考虑算 ...
- [SDOI2013]淘金 数位DP
做了好久.... 大致思路: 求出前k大的方格之和即为答案, 先考虑一维的情况,设f[i]为数位上各个数相乘为i的数的总数,也就是对于数i,有f[i]个数它们各个位相乘为i, 再拓展到二维,根据乘法原 ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- 数位DP复习小结
转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...
- 数位dp从会打模板到不会打模板
打了几个数位$dp$,发现自己除了会打模板之外没有任何长进,遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板(滑稽) 假设我们要处理$l----r$ 采用记忆化搜索的方式,枚举$< ...
随机推荐
- macbookpro安装Ubuntu16.04.1 LTS爬坑之旅。亲测有效(集众家之长)。安装时间为2017-11-19。
1.格式化U盘 要求:(1)切换分区格式为Mac OS扩展 (日志型):(2)方案(scheme)设置为:GUID Partition Map:如图(使用mac自带磁盘工具) 2.给Ubuntu划分磁 ...
- magento getUrl函数跳转admin模块问题
在用以下代码时,跳转后的url里面会是空的,即没有admin这个值 $this->getUrl('admin/catalog_product/edit', array('id' => $c ...
- hbase优化小结
目录: 1,背景 2,GC 3,hbase cache 4,compaction 5,其他 1,背景 项目组中,hbase主要用来备份mysql数据库中的表.主要通过接入mysql binlog,经s ...
- C#基础 for 穷举、迭代
//循环可以解决的问题类型 //穷举,把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. //单位给发了一张150元购物卡, //拿着到超市买三类洗化用品. //洗发水15元,香皂2元,牙 ...
- ftp获取mysql数据库方法
我说的这种情况是针对mysql数据库的,首先下载一个mysql通过ftp放到站点里面,然后通过配置文件找到数据库的名字和密码,然后通过浏览器访问数据库,直接在域名后面加上下载的mysql文件的名字就可 ...
- Javascript中的那些bug
1. x(比如document) is not defined 不止要检查是不是没有声明变量就使用了,还要检查是不是对象的方法调用写错了!比如: alert( document.getElementB ...
- opencv总结
2018-02-2623:59:02 唉,这软件我很烦躁,今天又搞了好几遍,出错提示的时候总是出问题! 而且,无论什么错误,都是提示一堆乱码! 定义ROI区域有两种方法,第一种是使用cv:Rect.顾 ...
- 可滚动的ResultSet类型 实现分页
可滚动的ResultSet类型. 这个类型支持前后滚动取得纪录next().previous(),回到第一行first(),同时还支持要取的 ResultSet中的第几行 absolute(int n ...
- Typora——自定义设置
Typora提供自定义设置,在偏好设置里面,有一个主题文件夹,如果对界面的样式进行设定,可以添加一个css文件,命名规范是 github.user.css,下面代码会对h1~h4进行自动序列化 bod ...
- Android Studio 入门 Hello World
Android Studio 入门 Hello World Gavin要加油 1.5k 6月22日 发布 推荐 1 推荐 收藏 17 收藏,2.1k 浏览 引言 前两天开始学习android开发,本来 ...