求出每个数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]的更多相关文章

  1. [Bzoj3131][Sdoi2013]淘金(数位dp)(优先队列)

    3131: [Sdoi2013]淘金 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 847  Solved: 423[Submit][Status][ ...

  2. bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)

    Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块.    一阵风吹 ...

  3. bzoj 3131 [Sdoi2013]淘金(数位dp)

    题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...

  4. [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)

    只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...

  5. BZOJ 3131 [SDOI2013]淘金 - 数位DP

    传送门 Solution 这道数位$DP$看的我很懵逼啊... 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到. 然后我们考虑算 ...

  6. [SDOI2013]淘金 数位DP

    做了好久.... 大致思路: 求出前k大的方格之和即为答案, 先考虑一维的情况,设f[i]为数位上各个数相乘为i的数的总数,也就是对于数i,有f[i]个数它们各个位相乘为i, 再拓展到二维,根据乘法原 ...

  7. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  8. 数位DP复习小结

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...

  9. 数位dp从会打模板到不会打模板

    打了几个数位$dp$,发现自己除了会打模板之外没有任何长进,遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板(滑稽) 假设我们要处理$l----r$ 采用记忆化搜索的方式,枚举$< ...

随机推荐

  1. WPF-CheckBox(复选框、功能开关)美化

    老规矩,先放图 按钮美化背景: 由于特殊需求,复选框样式单一,所以我们需要将其按钮重构和美化达到我们的需求 复选框美化思维引导: 图中1为背景色 图中2为边框 图中3为句柄控件组成(Path+Rect ...

  2. [Qt Creator 快速入门] 第5章 应用程序主窗口

    对于日常见到的应用程序而言,许多都是基于主窗口的,主窗口中包含了菜单栏.工具栏.状态栏和中心区域等.这一章会详细介绍主窗口的每一个部分,还会涉及资源管理.富文本处理.拖放操作和文档打印等相关内容.重点 ...

  3. 题解报告:poj 1321 棋盘问题(dfs)

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  4. Android 性能优化(23)*性能工具之「Heap Viewer, Memory Monitor, Allocation Tracker」Memory Profilers

    Memory Profilers In this document Memory Monitor Heap Viewer Allocation Tracker You should also read ...

  5. 365 Water and Jug Problem 水壶问题

    有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水.你允许:    装满任 ...

  6. .Net实战之反射外卖计费

    场景 叫外卖支付,可以有以下优惠: 1.  满30元减12 2.  是会员减配送费,比如5元 3.  优惠券 …. 问题? 如何在不改代码的情况下更灵活的去控制优惠的变化??? 有些代码与实际业务可能 ...

  7. <a>标签的href、onclick属性

    链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接): 参考:https://www.cnblogs.com/happykakeru/ar ...

  8. win7下安装MySQL 5.7.19(解压缩版)

    1.官网下载地址:https://downloads.mysql.com/archives/community/ 下载后,得到压缩包: 2.解压,我的解压目录为:E:\mysql-5.7.19\mys ...

  9. nw.js开发第一个程序(html开发桌面程序exe)

    一.环境配置 windows系统 cnpm install node 下载nw.js https://github.com/nwjs/nw.js 找到download下载合适的版本 二.开发 项目目录 ...

  10. apache启动失败提示预期<IfModule>结果<IfModule>>

    经过反复查看httpd.conf文件,发现原因是启动了两遍<IfModule>,也就是出现内容重复标签重复曾经遇到类似的情况Apache2: Expected </> but ...