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

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划267:bzoj3129: [Sdoi2013]方程

    http://www.lydsy.com/JudgeOnline/problem.php?id=3129 如果没有Ai的限制,就是隔板法,C(m-1,n-1) >=Ai 的限制:m减去Ai &l ...

  3. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  4. bzoj千题计划133:bzoj3130: [Sdoi2013]费用流

    http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...

  5. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  6. bzoj千题计划258:bzoj3123: [Sdoi2013]森林

    http://www.lydsy.com/JudgeOnline/problem.php?id=3123 启发式合并主席树 #include<cmath> #include<cstd ...

  7. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  8. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  9. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

随机推荐

  1. SpringBoot日记——编码配置篇

    插入一个小篇章,有人在编写代码的时候,要么控制台乱码,要么页面乱码等等, 我这里有个配置,可以解决各种乱码问题,直接来看. # ==================== 编码配置 ========== ...

  2. Express模版引擎hbs备忘

    最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的 ...

  3. 一、Unity Editor自定义菜单

    官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...

  4. Leetcode(力扣) 整数反转

    Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...

  5. 第十五次ScrumMeeting博客

    第十五次ScrumMeeting博客 本次会议于12月4日(一)22时整在3公寓725房间召开,持续30分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容和 ...

  6. [Docker基础]如何清除不用的资源

    Docker - How to cleanup resources 有时你可能需要清理Docker中不用的资源,特别是在学习Docker过程中创建的镜像.容器.网络.存储卷等. delete volu ...

  7. mysql左外连接

    左外连接的概念性不说了,这次就说一说两个表之间的查询步骤是怎么样的? 例如 SELECT ut.id,ut.name,ut.age, ut.sex,ut.status,st.score,st.subj ...

  8. css3新增的伪类和伪元素

    E:target事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口 E:disabled表示不可点击的表单控件 E:enabled表示可点击的表单控件 E:checked表 ...

  9. 表格-table 样式

    .table: 表格基本样式 .table-dark:表格显示为黑色 .thead-light: 表头显示颜色跟亮 .thead-dark:表头显示为黑色 .table-striped:表格以条纹形式 ...

  10. CF1073E Segment Sum

    数位DP,求[L,R]区间内所有"数字内包含的不同数码不超过k个的数字"之和.在状态上加一维状态压缩表示含有的数码集合.一开始读错题以为是求数字的个数.读对题之后调了一会儿. #i ...