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. Task03:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. 干货丨数据科学、机器学习、人工智能,究竟有什么区别?
  3. 关于比特币现金的一些误区
  4. python之time和datetime的常用方法
  5. 【移动开发】安卓Lab2(01)
  6. C语言Stock span 库存跨度问题(附完整源码)
  7. 编程之美2——N!的二进制表示中最低位1的位置
  8. Kafka初始化和故障转移
  9. 一项一项教你测等保2.0——Windows入侵防范
  10. 【转载】用平常语言介绍神经网络
  11. namespace用法
  12. 5G 时代,AIoT 该如何布局?
  13. android fragment实例化,Android使得Fragment 切换时不重新实例化
  14. Java编码规范总结
  15. BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
  16. 使用Andriod Device Moniter时用正则表达式筛选指定日志
  17. 神牛闪光灯TT865/V850II 860II Sony热靴口损坏,更换新热靴口
  18. Android Studio新手必读
  19. 2021年低压电工免费试题及低压电工考试技巧
  20. 51单片机学习——9--温度传感器DS18B20

热门文章

  1. 猿创征文|我命由我,不由天
  2. 旷视科技 face++ 嵌入式软件开发-面试---深度好文
  3. 小程序全套购物车(全选,单选,反选,删除,价格计算)
  4. java文件 默认打开方式_修改文件的默认打开方式(亲测有效)
  5. python中复数类型的实部和虚部都是浮点数_Python合集之Python数据类型(一)
  6. 《现代控制系统》第五章——反馈控制系统性能分析 5.3 二阶系统的性能
  7. Python Web开发:Django+BootStrap实现简单的博客项目
  8. python读取csv文件并绘图
  9. 计算机win7不断重启,win7系统电脑一开机就自动重启的解决方法
  10. Hark的数据结构与算法练习之若领图排序ProxymapSort