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+7;LL dp[2][2][41][27][19][16];
int f[10][4];int a[14];int cnt;
LL b[10001];priority_queue< pair<LL,pair<int,int> > >q;
map<pair<int,int>,bool>vis;void pre()
{f[2][0]=1;f[3][1]=1;f[4][0]=2;f[5][2]=1;f[6][0]=1;f[6][1]=1;f[7][3]=1;f[8][0]=3;f[9][1]=2;
}void reverse(int len)
{int k=len/2;for(int i=1;i<=k;++i) swap(a[i],a[len-i+1]);
}void ADD(int &x,int y)
{x+=y;x-=x>=mod ? mod : 0;
}LL Pow(LL a,int b)
{LL res=1;for(;b;a*=a,b>>=1)if(b&1) res*=a;return res;
}void numberDP(LL n)
{int len=0;LL m=n;while(m) a[++len]=m%10,m/=10;reverse(len);int up,J;int now=0,nxt=1;for(int i=0;i<len;++i,swap(now,nxt)){if(!i) dp[now][1][0][0][0][0]++;else dp[now][0][0][0][0][0]++;memset(dp[nxt],0,sizeof(dp[nxt]));for(int j=0;j<=1;++j)for(int c2=0;c2<=40;++c2)for(int c3=0;c3<=26;++c3)for(int c5=0;c5<=18;++c5)for(int c7=0;c7<=15;++c7)if(dp[now][j][c2][c3][c5][c7]){if(j) up=a[i+1];else up=9;for(int k=1;k<=up;++k){J=(j && k==up);dp[nxt][J][c2+f[k][0]][c3+f[k][1]][c5+f[k][2]][c7+f[k][3]]+=dp[now][j][c2][c3][c5][c7];}}}LL sum,tmp;for(int c2=0;c2<=40;++c2){tmp=Pow(2,c2);if(tmp>n) break;for(int c3=0;c3<=26;++c3){tmp=Pow(2,c2)*Pow(3,c3);if(tmp>n) break;for(int c5=0;c5<=18;++c5){tmp=Pow(2,c2)*Pow(3,c3)*Pow(5,c5);if(tmp>n) break;for(int c7=0;c7<=15;++c7){tmp=Pow(2,c2)*Pow(3,c3)*Pow(5,c5)*Pow(7,c7);if(tmp>n) break;sum=dp[now][0][c2][c3][c5][c7]+dp[now][1][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+1,b+cnt+1,greater<int>());int i=1,j=1;int ans=0;pair<LL,pair<int,int> >pr;int x,y;q.push(make_pair(b[1]*b[1],make_pair(1,1)));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+1,y)]) {q.push(make_pair(b[x+1]*b[y],make_pair(x+1,y)));vis[make_pair(x+1,y)]=true;}if(!vis[make_pair(x,y+1)]) {q.push(make_pair(b[x]*b[y+1],make_pair(x,y+1)));vis[make_pair(x,y+1)]=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 0;
}

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8536499.html

bzoj千题计划268:bzoj3131: [Sdoi2013]淘金相关推荐

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

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

  2. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

  3. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  4. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  5. bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...

  6. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  7. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

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

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

  9. bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...

最新文章

  1. [Quick-x]制作新手引导高亮区域方法之二:裁剪模式
  2. C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
  3. 修改MYSQL最大连接数的3种方法
  4. kotlin读取sd卡里的文件_如何在Kotlin中写入文件?
  5. Android 版本对于 API
  6. JDBC的API与德鲁伊Druid连接池配置
  7. Java的重写equals但不重写hashCode方法的影响
  8. 85. php 绘图体系
  9. SQL:查询表中各类点数量以及各类点满足某条件数量
  10. 飞贷金融科技董事长唐侠:攻占小微金融全球制高点 | 一点财经
  11. android 魅族 webview,魅族 Flyme 系统出现大面积应用闪退问题,提供临时解决方法...
  12. html5自动调用js函数,从html文件中的外部js文件调用Javascript函数
  13. LaTeX代码: 下划线与删除线 ← 利用 ulem 宏包
  14. python实现微信自动加群_为Python开发人员提供实时代码片段,Kite获1700万美元A轮融资...
  15. Dev-C++如何更改字体大小
  16. 动态规划---买卖股票的最佳时机
  17. 通过Dockerfile创建docker镜像
  18. 【区块链开发】区块链农产品溯源App
  19. 4 轮拿下字节 Offer,面试题复盘
  20. 2022(核酸年)结束了

热门文章

  1. 阿里云安全送您六道平安符,恭贺新春! 1
  2. 聊聊3D建模行业的发展前景,这类建模师目前最吃香
  3. 区块链钱包—BTC Java版离线签名交易
  4. Git No newline at end of file
  5. FirefoxOS 系统进程初步分析 底层系统继承自 android
  6. 输入一个整数n,按要求生成一个n*n的蛇形矩阵
  7. 关于微软虚拟机更新后密码问题
  8. HC3i论坛医疗信息化热门资源100个
  9. 更换主板后 Office无法激活问题解决
  10. 2020年区块链行业十大趋势