bzoj千题计划268:bzoj3131: [Sdoi2013]淘金
http://www.lydsy.com/JudgeOnline/problem.php?id=3131
如果已知 s[i]=j 表示有j个<=n数的数码乘积=i
那么就会有 s[a1]*s[a2] 个数 在一阵风之后到(a1,a2)位置
把所有的j用一个数组b存起来,从大到小排序
开始把(1,1)存入堆,表示当前最多的是b[1]*b[1]
每次取出堆顶(i,j),累加 b[i]*b[j],存入(i+1,j),(i,j+1),map 判重
就可以解决前k大之和的问题
i的上限是n,存不下,怎么办
我们发现 n以内 有大量的i 是无用的
只有质因数分解之后 质因子为2、3、5、7 的i 才是合法状态
所以 dp[len][0/1][c2][c3][c5][c7] 表示前len位,是否卡上界,当前i=2^c2 * 3^c3 * 5^c5 * 7^c7 的 j是多少
数位dp
注意不能放0,但是可以有前导0,所以除了最高位,都要加上前导0的贡献,即dp[][0][0][0][0][0]++ (前导0不卡上界)
#include<map>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; typedef long long LL; const int mod=1e9+; LL dp[][][][][][];
int f[][]; int a[]; int cnt;
LL b[]; priority_queue< pair<LL,pair<int,int> > >q;
map<pair<int,int>,bool>vis; void pre()
{
f[][]=;
f[][]=;
f[][]=;
f[][]=;
f[][]=;
f[][]=;
f[][]=;
f[][]=;
f[][]=;
} void reverse(int len)
{
int k=len/;
for(int i=;i<=k;++i) swap(a[i],a[len-i+]);
} void ADD(int &x,int y)
{
x+=y;
x-=x>=mod ? mod : ;
} LL Pow(LL a,int b)
{
LL res=;
for(;b;a*=a,b>>=)
if(b&) res*=a;
return res;
} void numberDP(LL n)
{
int len=;
LL m=n;
while(m) a[++len]=m%,m/=;
reverse(len);
int up,J;
int now=,nxt=;
for(int i=;i<len;++i,swap(now,nxt))
{
if(!i) dp[now][][][][][]++;
else dp[now][][][][][]++;
memset(dp[nxt],,sizeof(dp[nxt]));
for(int j=;j<=;++j)
for(int c2=;c2<=;++c2)
for(int c3=;c3<=;++c3)
for(int c5=;c5<=;++c5)
for(int c7=;c7<=;++c7)
if(dp[now][j][c2][c3][c5][c7])
{
if(j) up=a[i+];
else up=;
for(int k=;k<=up;++k)
{
J=(j && k==up);
dp[nxt][J][c2+f[k][]][c3+f[k][]][c5+f[k][]][c7+f[k][]]+=dp[now][j][c2][c3][c5][c7];
}
}
}
LL sum,tmp;
for(int c2=;c2<=;++c2)
{
tmp=Pow(,c2);
if(tmp>n) break;
for(int c3=;c3<=;++c3)
{
tmp=Pow(,c2)*Pow(,c3);
if(tmp>n) break;
for(int c5=;c5<=;++c5)
{
tmp=Pow(,c2)*Pow(,c3)*Pow(,c5);
if(tmp>n) break;
for(int c7=;c7<=;++c7)
{
tmp=Pow(,c2)*Pow(,c3)*Pow(,c5)*Pow(,c7);
if(tmp>n) break;
sum=dp[now][][c2][c3][c5][c7]+dp[now][][c2][c3][c5][c7];
if(sum) b[++cnt]=sum;/*,printf("%d %d %d %d %I64d\n",c2,c3,c5,c7,sum)*/;
}
}
}
}
} void get_kth(int k)
{
sort(b+,b+cnt+,greater<int>());
int i=,j=;
int ans=;
pair<LL,pair<int,int> >pr;
int x,y;
q.push(make_pair(b[]*b[],make_pair(,)));
while(k-- && !q.empty())
{
pr=q.top();
q.pop();
if(!pr.first) break;
ADD(ans,pr.first%mod);
x=pr.second.first;
y=pr.second.second;
if(!vis[make_pair(x+,y)])
{
q.push(make_pair(b[x+]*b[y],make_pair(x+,y)));
vis[make_pair(x+,y)]=true;
}
if(!vis[make_pair(x,y+)])
{
q.push(make_pair(b[x]*b[y+],make_pair(x,y+)));
vis[make_pair(x,y+)]=true;
}
}
printf("%d",ans);
} int main()
{
//freopen("gold.in","r",stdin);
//freopen("gold.out","w",stdout);
LL n; int k;
scanf("%lld%d",&n,&k);
pre();
numberDP(n);
get_kth(k);
return ;
}
bzoj千题计划268:bzoj3131: [Sdoi2013]淘金的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划267:bzoj3129: [Sdoi2013]方程
http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...
- bzoj千题计划134:bzoj3124: [Sdoi2013]直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...
- bzoj千题计划133:bzoj3130: [Sdoi2013]费用流
http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...
- bzoj千题计划258:bzoj3123: [Sdoi2013]森林
http://www.lydsy.com/JudgeOnline/problem.php?id=3123 启发式合并主席树 #include<cmath> #include<cstd ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
随机推荐
- java监听器(Listener)学习笔记
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次, ...
- 如何安装ipa文件(二)
第一篇文章请看: http://www.cnblogs.com/BK-12345/p/6000124.html 写第二篇的目的是因为iTunes更新了,有一些东西发生了变化,应用没有了,其实还是存在的 ...
- 虚拟机console基础环境部署——安全加固
1. 概述 安全是一个重要的课题.广义上可以总结为: 主机安全 网络安全 信息安全 数据安全 虽然console已经是最小化安装,但是这并不能说明console就已经安全了.之前的博客对console ...
- Asp.Net_优化
ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库 ...
- Unity关于方法事件生命周期官方文档
http://docs.unity3d.com/Manual/ExecutionOrder.html 一.组件运行的基本顺序 下图中创建类的顺序为A,B,C,A1,二运行的结果为A1,B,C,A. 可 ...
- "Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network" 解读
简介:这是一篇17年的CVPR,作者提出使用现有的人脸识别深度神经网络Resnet101来得到一个具有鲁棒性的人脸模型. 原文链接:https://www.researchgate.net/publi ...
- LeetCode 70. Climbing Stairs爬楼梯 (C++)
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- [转帖] 学习 Linux 大页的内存知识
一.在解释什么情况下需要开启大页和为啥需要开启大页前先了解下Linux下页的相关的知识:以下的内容是基于32位的系统,4K的内存页大小做出的计算1)目录表,用来存放页表的位置,共包含1024个目录en ...
- 阿里云视频直播PHP-SDK接入教程
阿里云视频直播PHP-SDK接入教程 阿里云 视频直播 配置 及 PHP-SDK 接入教程 准备工作 域名管理 配置鉴权 地址生成器及DEMO演 ...
- poi中如何自定义日期格式
1. poi的“Quick Guide”中提供了 “How to create date cells ”例子来说明如何创建日期单元格,代码如下: HSSFCellStyle cellStyle = w ...