链接

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的更多相关文章

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

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

  2. [SDOI2013]淘金 数位DP

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

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

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

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

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

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

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

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

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

  7. 数位DP学习笔记

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

  8. Bzoj 3131 [Sdoi2013]淘金 题解

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

  9. 题解-SDOI2013 淘金

    题面 SDOI2013 淘金 有一个 \(X\).\(Y\) 轴坐标范围为 \(1\sim n\) 的范围的方阵,每个点上有块黄金.一阵风来 \((x,y)\) 上的黄金到了 \((f(x),f(y) ...

随机推荐

  1. Java类访问控制

      public protected default private 本类 可见 可见 可见 可见 本类所在包 可见 可见 可见 不可见 其他包中的子类 可见 可见 不可见 不可见 其他包中的非子类 ...

  2. python多版本控制

    1安装git # yum install git -y 2.安装python依赖 # yum -y install gcc make patch gdbm-devel openssl-devel sq ...

  3. linux本地机上传文件到服务器

    最近工作全部切换到了linux环境下,就是吃喝拉撒全在linux下,微信,web端,qq,web端,-------,各种socket编程,网络通讯- 本地linux机从阿里云下载文件

  4. Gambler Bo (高斯消元求特解)

    对于图中的每一个点假设点击Xi * m + j 然后每个点都有那么对于每一个点可以列举出一个方程式,n*m个点解n*m个未知数.利用高斯消元就可以解决. 问题就在这个题目可能不止有一个特,所以我们需要 ...

  5. orb slam2 双目摄像头

    主要参考了http://blog.csdn.net/awww797877/article/details/51171099这篇文章,其中需要添加的是:export ROS_PACKAGE_PATH=$ ...

  6. flask 对URL进行安全验证

    对URL进行安全验证 虽然我们已经实现了重定向会上一个页面的功能,但是安全问题不容忽视,鉴于referer和next容易被串篡改的特性,我们需要对这些值进行验证,否则会形成开放重定向漏洞   以URL ...

  7. 【Alpha版本】冲刺阶段——Day5

    [Alpha版本]冲刺阶段--Day5 阅读目录 今日进展 问题困难 明日任务 今日贡献量 站立式会议 TODOlist [今日进展] 完成登录类代码 public void LOGIN() { co ...

  8. 使用commons-compress解压GBK格式winzip文件到UTF8,以及错误使用ZipArchiveInputStream读出来数据全是空的解决办法

    先上正确方法: 正确方式应该为,先创建一个ZipFile,然后对其entries做遍历,每一个entry其实就是一个文件或者文件夹,检测到文件夹的时候创建文件夹,其他情况创建文件,其中使用zipFil ...

  9. AtCoder Beginner Contest 045 B - 3人でカードゲームイージー / Card Game for Three (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice, Bob and Charlie ...

  10. @Configuration与@Bean作用

    Spring的Java配置方式是通过@Configuration和@Bean这两个注解来实现 @Configuration可以作用在任意类上,表示该类是一个配置类,其实就相当于一个xml配置文件. @ ...