bzoj 3131: [Sdoi2013]淘金
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#define ll long long
#define M 40009
#define MO 1000000007
using namespace std;
int a[],tot,K,anss;
ll ans[*M],n,f[][M][],size[M],m;
struct data
{
int x,y;
ll z;
data(int a1,int a2)
{
x=a1;
y=a2;
z=size[x]*size[y];
}
bool operator <(data a1)const
{
return z<a1.z;
}
};
void dfs(int wei,ll a1,int now)
{
if(a1>m)
return;
if(wei==tot)
{
ans[++ans[]]=a1;
return;
}
for(int i=now;i<;i++)
dfs(wei+,a1*i,i);
return;
}
bool cmp(ll a1,ll a2)
{
return a1>a2;
}
int main()
{
scanf("%lld%d",&n,&K);
m=n;
for(;n;n/=)
a[++tot]=n%;
dfs(,,);
sort(ans+,ans+ans[]+);
ans[]=unique(ans+,ans+ans[]+)-ans-;
f[][][]=;
for(int i=;i<tot;i++)
{
for(int j=;j<=ans[];j++)
for(int k=;k<;k++)
if(f[i][j][k])
for(int l=;l<;l++)
{
ll a1=ans[j]*l;
if(a1>ans[ans[]])
continue;
a1=lower_bound(ans+,ans+ans[]+,a1)-ans;
f[i+][a1][(k+l)>a[i+]]+=f[i][j][k];
}
}
for(int i=;i<ans[];i++)
for(int j=;j<tot;j++)
size[i]+=f[j][i][]+f[j][i][];
for(int i=;i<=ans[];i++)
size[i]+=f[tot][i][];
sort(size+,size+ans[]+,cmp);
priority_queue<data> p;
p.push(data(,));
for(;!p.empty();)
{
K--;
data q=p.top();
p.pop();
anss=(anss+q.z)%MO;
if(!K)
break;
if(q.x!=q.y)
{
anss=(anss+q.z)%MO;
K--;
if(!K)
break;
p.push(data(q.x+,q.y));
}
if(q.x==)
p.push(data(q.x,q.y+));
}
printf("%d",anss);
return ;
}
DP求出转移到x坐标的数目。各位数乘积的实际数目少。
bzoj 3131: [Sdoi2013]淘金的更多相关文章
- Bzoj 3131 [Sdoi2013]淘金 题解
3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 733 Solved: 363[Submit][Status][ ...
- bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)
Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹 ...
- BZOJ 3131 [SDOI2013]淘金 - 数位DP
传送门 Solution 这道数位$DP$看的我很懵逼啊... 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到. 然后我们考虑算 ...
- bzoj 3131 [Sdoi2013]淘金(数位dp)
题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...
- [Bzoj3131][Sdoi2013]淘金(数位dp)(优先队列)
3131: [Sdoi2013]淘金 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 847 Solved: 423[Submit][Status][ ...
- [BZOJ3131] [Sdoi2013]淘金
[BZOJ3131] [Sdoi2013]淘金 Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐 ...
- 题解-SDOI2013 淘金
题面 SDOI2013 淘金 有一个 \(X\).\(Y\) 轴坐标范围为 \(1\sim n\) 的范围的方阵,每个点上有块黄金.一阵风来 \((x,y)\) 上的黄金到了 \((f(x),f(y) ...
- 【bzoj 3131】[Sdoi2013]淘金
Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹 ...
- bzoj千题计划268:bzoj3131: [Sdoi2013]淘金
http://www.lydsy.com/JudgeOnline/problem.php?id=3131 如果已知 s[i]=j 表示有j个<=n数的数码乘积=i 那么就会有 s[a1]*s[a ...
随机推荐
- PHP基础班初学心得:关于网页创作
前提:本人刚参加PHP基础班培训第一天,由于之前毫无基础,分享的心得可能不规范,方法也许也"旁门左道",不能保证质量,只作自己总结学习,也希望能帮助到同样是初学者的朋友们,共同进步 ...
- [Effective JavaScript 笔记]第64条:对异步循环使用递归
假设需要有这样一个函数,接收一个URL的数组并尝试依次下载每个文件直到有一个文件被成功下载.如果API是同步的,使用循环很简单实现. function downloadOneSync(urls){ f ...
- UICollectionViewDelegateFlowLayout 使用
import UIKit //UICollectionViewLayout //itemSize属性 //设定全局的Cell尺寸,如果想要单独定义某个Cell的尺寸,可以使用下面方法: // - (C ...
- Windows:常见问题
1.文件(夹)非法字符 Windows系统文件(夹)非法字符"\\/:*?\"<>|",不包含‘.’,但"."字符不能是文件(夹)的首字符 ...
- Linux下的PostgreSQL简单安装手册
1. 安装环境 linux版本: CentOS release 6.2 (Final) pg版本 : postgresql-9.5.0 2. pg数据库下载地址 --http ...
- html、css 【珍藏】
行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效. 块级元素: 各占据一 ...
- SVN错误及处理
SVN无法读取current修复方法 Can't read file : End of file found 文件:repository/db/txn_current.repository/db/cu ...
- 3. Swift 数组|字典|集合
在OC中数组,字典,集合有自己的表示方法,分别是Array,Dictionary,Set 与 String 都属于数值类型变量,他们都属于结构体. 使用简介灵活多变,个人感觉可读性变差了很多,用起来由 ...
- flex 4.6 移动开发 app.xml配置说明
<?xml version="1.0" encoding="utf-8" standalone="no"?> <appli ...
- python 中的input
渣渣之路. 一. 在python编程初学者指南中的第六章.使用参数和返回值的例子中: # -*- coding: utf-8 -*- def display(message): print messa ...