bozoj3131: [Sdoi2013]淘金 数位dp
链接
https://www.lydsy.com/JudgeOnline/problem.php?id=3131
思路
1.
函数值的素因子只有2、3、5、7
由他们组成的状态不多,爆搜的时候即使搜不对也没关系,我们只是缩小范围而已
所以不要管呢么多,搜到几万就差不多了,包含有可能的就行
2.
\(f[i][j][0/1]\)表示后i位,乘积为j,n的i位>=k(枚举1-9)?1:0
n的i位>k
\(f[i][j][1]+=f[i][j][1]+f[i][j][0]\)
n的i位<k
\(f[i][j][0]+=f[i][j][1]+f[i][j][0]\)
n的i位==k
\(f[i][j][1]+=f[i][j][1]\)
\(f[i][j][0]+=f[i][j][0]\)
3.
统计的时候,sort
之后想象成二维数组,每一行都是单调的,所以只用头做比较,堆维护就可以
单调队列没想过
错误$$感叹
dp调试真快啊,处理起来真恶心曹丹清啊
代码
#include <iostream>
#include <queue>
#include <map>
#include <cstdio>
#include <algorithm>
#include <vector>
#define ll long long
const ll N=5e5+7;
const ll mod=1e9+7;
using namespace std;
ll n,k,val[N],c[N],js;
ll f[15][N][2];
ll A,B,jl[15];
map<ll,ll> hasH;
struct Pair {
ll first,second;
Pair() {}
Pair(ll a,ll b) :
first(a),second(b) {}
};
bool operator < (Pair a,Pair b) {
if(a.second==js+1) return 0;
if(b.second==js+1) return 1;
return c[a.first]*c[a.second]<c[b.first]*c[b.second];
}
bool cmp(ll a,ll b) {
return a>b;
}
priority_queue<Pair> q;
int main() {
// freopen("a.in","r",stdin);
cin>>n>>k;
for(ll a=0,tmp_a=1;a<=39;++a,tmp_a*=2) {
if(tmp_a>n) break;
for(ll b=0,tmp_b=1;b<=25;++b,tmp_b*=3) {
if(tmp_a*tmp_b>n) break;
for(ll c=0,tmp_c=1;c<=17;++c,tmp_c*=5) {
if(tmp_a*tmp_b*tmp_c>n) break;
for(ll d=0,tmp_d=1;d<=14;++d,tmp_d*=7) {
if(tmp_a*tmp_b*tmp_c*tmp_d>n) break;
if(tmp_a*tmp_b*tmp_c*tmp_d==0) continue;
val[++js]=tmp_a*tmp_b*tmp_c*tmp_d;
}
}
}
}
sort(val+1,val+1+js);
js=unique(val+1,val+1+js)-val-1;
for(ll i=1;i<=js;++i) hasH[val[i]]=i;
ll AAA=0;
while(n) jl[++AAA]=n%10,n/=10;
f[0][1][1]=1;
for(ll i=1;i<=AAA;++i) {
for(ll j=1;j<=js;++j) {
for(ll k=1;k<=9;++k) {
if(val[j]%k==0) {
ll w=hasH[val[j]/k];
if(k==jl[i]) {
f[i][j][1]+=f[i-1][w][1];
f[i][j][0]+=f[i-1][w][0];
} else if(k<jl[i]) {
f[i][j][1]+=f[i-1][w][0]+f[i-1][w][1];
} else {
f[i][j][0]+=f[i-1][w][0]+f[i-1][w][1];
}
}
}
}
}
for(ll i=1;i<=js;++i) {
for(ll j=1;j<AAA;++j)
c[i]+=f[j][i][0]+f[j][i][1];
c[i]+=f[AAA][i][1];
}
sort(c+1,c+1+js,cmp);
for(ll i=1;i<=js;++i) q.push(Pair(i,1));
ll ans=0;
for(ll i=1;i<=k;++i) {
Pair x=q.top();
q.pop();
ans+=c[x.first]*c[x.second]%mod;
ans%=mod;
q.push(Pair(x.first,x.second+1));
}
cout<<ans<<"\n";
return 0;
}
bozoj3131: [Sdoi2013]淘金 数位dp的更多相关文章
- BZOJ 3131 [SDOI2013]淘金 - 数位DP
传送门 Solution 这道数位$DP$看的我很懵逼啊... 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到. 然后我们考虑算 ...
- [SDOI2013]淘金 数位DP
做了好久.... 大致思路: 求出前k大的方格之和即为答案, 先考虑一维的情况,设f[i]为数位上各个数相乘为i的数的总数,也就是对于数i,有f[i]个数它们各个位相乘为i, 再拓展到二维,根据乘法原 ...
- [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数 ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- Bzoj 3131 [Sdoi2013]淘金 题解
3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 733 Solved: 363[Submit][Status][ ...
- 题解-SDOI2013 淘金
题面 SDOI2013 淘金 有一个 \(X\).\(Y\) 轴坐标范围为 \(1\sim n\) 的范围的方阵,每个点上有块黄金.一阵风来 \((x,y)\) 上的黄金到了 \((f(x),f(y) ...
随机推荐
- [8]windows内核情景分析--窗口消息
消息与钩子 众所周知,Windows系统是消息驱动的,现在我们就来看Windows的消息机制. 早期的Windows的窗口图形机制是在用户空间实现的,后来为了提高图形处理效率,将这部分移入内核空间,在 ...
- 在lnmp1.3布置的web服务器上运行thinkphp3.2.3项目pathinfo路径模式
通过我的经历希望能给大家带来一些帮助: 我是在Linux系统上通过https://lnmp.org/install.html设置Nginx服务器,使用的是lnmp1.3版本,之后将一个thinkphp ...
- 集合List
//数组 存值长度固定,类型固定 //集合 长度不固定,类型也可以不固定 List<int> list = new List<int>(); //list.Add(78); ; ...
- python二 总结--函数-- 装饰器
装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码 ...
- 从windows本地IDE启动远程Linux文件进行调试
1) 因为WingIDE调用putty和plink进行ssh连接,需要先设置putty. 点击下载putty,并解压,把解压路径附到操作系统PATH环境变量中,之后重新启动WingIDE,让它重新读 ...
- python os.path.dirname()
----返回文件所在的路径 ----如果path变量直接是文件名则返回空
- windows环境下 curl 安装和使用
curl下载地址:https://curl.haxx.se/download.html,拉到页面最底下,选择红色选中的那个CAB的进行下载,如下图所示: 下载完成后,解压. 解决windows控制台c ...
- 设置 DNS,防止 DNS 污染,清除 DNS 缓存ipconfig /flushdns
设置 DNS,防止 DNS 污染选中“使用下面的 DNS 服务器地址”,“首选 DNS 服务器”中填写 8.8.8.8,“备用 DNS 服务器”中填写 8.8.4.4,然后点击“确定”按钮清除 DNS ...
- 算法提高 11-1实现strcmp函数
问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2.若s1与s2相等返回 ...
- JustOj 1936: 小明A+B
题目描述 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于 ...