【bzoj2118】 墨墨的等式
http://www.lydsy.com/JudgeOnline/problem.php?id=2118 (题目链接)
题意
给出${B}$的取值范围${[Bmin,Bmax]}$,求方程${a_{1}*x_{1}+a_{2}*b_{2}+~~+a_{n}*b_{n}=B}$有多少${B}$可以使等式存在非负整数解。
Solution
问题很容易就被转化为:用${a_{1},a_{2},a_{3},······a_{n}}$能组成多少个在范围${[Bmin,Bmax]}$内的数。这是一类经典的图论问题。
我们假设${a}$中最小的元素为${T}$,可以考虑用${n}$个数能够组成的数对${T}$的模的情况。用${dis[i]}$表示构成的一个数${Q}$,且${Q mod T=i}$,${Q}$是满足上述两个条件的最小值。我们在这里将题目中的区间改为具体的询问,更好的进行讨论,对于询问${X}$,设${X mod T=i}$,则有以下三种情况:
- ${dis[i]>x}$。由于用这${n}$个数构成的一个模${T}$为${i}$的数,这个数的最小值为${dis[i]}$,而${dis[i]>x}$,说明${X}$是无法构成的。
- ${dis[i]=x}$。由于用这${n}$个数构成的一个模${T}$为${i}$的数,这个数的最小值为${dis[i]}$,而${dis[i]=x}$,说明${X}$可以构成,且是能构成的模${T}$等于${i}$的最小的数。
- ${dis[i]<x}$。由于用这${n}$个数构成的一个比${X}$更小的${~mod~T}$为${i}$的数${Q}$,则${X~mod~T=Q~mod~T}$,且${X}$必定可以由${Q}$加上若干个${T}$得到,因此,${X}$也是可以构成的。
由上述三点可知,当${dis[i]<=X}$时,${X}$是可以被构成的,否则则不能。
现在的问题是如何求解${dis}$数组?
相信各位看官已经发现${dis}$数组的命名有点诡异,没错就是用最短路求解。由于${dis[i]~mod~T=i}$,${i}$的范围在${0~T-1}$内,因此可以建立${T}$个点${0,1,2,······,T-1}$。对于点${i}$和任意一个数${a[j]}$,设${k=(i+a[j])~mod~T}$,可以认为从${i}$到${k}$连条边权为${a[j]}$的边,表示可以从${~mod~T=i}$这个点,通过加上边权${a[j]}$,到达${~mod~T=k}$的点。由于${T~mod~T=0}$,即可设${T}$为数字编号为0的点。要求${X}$是否能由${n}$个数构成,就要求出${dis[X~mod~T]}$的最小值了;当${X}$大于等于${dis[X~mod~T]}$,它就能够由着${n}$个数构成,设${X~mod~T=j}$,${dis[j]}$即为${j}$这个点到达${0}$点的最短距离,它可以由0点直接加边权${a[j]}$得到,也可以经过其他中间点到达。转换后,它就是个最短路问题了。
再回到这个问题上。于是我们先建图,跑一遍最短路,预处理出${dis}$数组,然后枚举${i=0}$~${T-1}$,计算模${T}$为${i}$的数在区间${[Bmin,Bmax]}$中有多少个,统计答案即可。
细节
堆里面又忘记开long long了,尴尬。
代码
// bzoj2118
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define MOD 10007
#define inf (1ll<<60)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=500010;
struct edge {int to,next,w;}e[maxn*10];
struct data {
LL num,w;
friend bool operator < (const data a,const data b) {
return a.w>b.w;
}
};
int head[maxn],a[maxn],vis[maxn];
int n,cnt;
LL L,dis[maxn],R; void link(int u,int v,int w) {
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].w=w;
}
void Dijkstra() {
priority_queue<data> q;
for (int i=0;i<a[1];i++) dis[i]=inf;
data x=(data){0,0},y;
dis[0]=0;
q.push(x);
while (!q.empty()) {
x=q.top();q.pop();
if (vis[x.num]) continue;
vis[x.num]=1;
for (int i=head[x.num];i;i=e[i].next)
if (dis[e[i].to]>x.w+e[i].w) {
y.w=dis[e[i].to]=x.w+e[i].w;
y.num=e[i].to;
q.push(y);
}
}
}
int main() {
scanf("%d%lld%lld",&n,&L,&R);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
if (!a[n]) return printf("0"),0;
for (int i=0;i<a[1];i++)
for (int j=2;j<=n;j++) link(i,(a[j]+i)%a[1],a[j]);
Dijkstra();
LL ans=0;
for (int i=0;i<a[1];i++) if (dis[i]<=R) {
LL l=max(0ll,(L-dis[i])/a[1]);
if (l*a[1]+dis[i]<L) l++;
LL r=(R-dis[i])/a[1];
if (r*a[1]+dis[i]>R) r--;
ans+=r-l+1;
}
printf("%lld\n",ans);
return 0;
}
【bzoj2118】 墨墨的等式的更多相关文章
- 【BZOJ2118】墨墨的等式(最短路)
[BZOJ2118]墨墨的等式(最短路) 题面 BZOJ 洛谷 题解 和跳楼机那题是一样的. 只不过走的方式从\(3\)种变成了\(n\)种而已,其他的根本没有区别了. #include<ios ...
- 【BZOJ2118】墨墨的等式 最短路
[BZOJ2118]墨墨的等式 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值 ...
- BZOJ2118墨墨的等式[数论 最短路建模]
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1317 Solved: 504[Submit][Status][Discus ...
- Bzoj2118 墨墨的等式
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1488 Solved: 578 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+ ...
- BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2944 Solved: 1206[Submit][Status][Discu ...
- BZOJ2118:墨墨的等式(最短路)
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- p2371&bzoj2118 墨墨的等式
传送门(bzoj) 题目 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存 ...
- BZOJ2118: 墨墨的等式(最短路 数论)
题意 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. So ...
- BZOJ2118: 墨墨的等式(最短路构造/同余最短路)
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- 【BZOJ 2118】 墨墨的等式(Dijkstra)
BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...
随机推荐
- smarty foreach循环
1,smarty foreach1,单纯的数组array(1000,2000,3000),使用foreach(from = $array item=foo){$foo}2,键值对数组<ul> ...
- mysql查看数据库和表的占用空间大小
mysql查看数据库和表的占用空间大小 第一部分-任务 将线上db,导出后,导入到office db 一. 两种方案: 1,将数据直接从online-->office,通过mysqldump ...
- typeof关键字简介 -rtti
typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ...
- 设置select默认值
W3C下设置一个默认值直接为 select.value='默认值'. IE8下设置默认值必须有这个option才能被设置,不像W3C 如chrome这种,直接设置就能显示,如果IE下这样设置的话sel ...
- vmware安装cent os 6.5 + oracle 11g xe + jboss eap 6.2 + weblogic 12c+ webshpere mq 7.5
前言: mac系统发展速度确实很快,短短数年,mac os上已经能网银支付(中行.招行.工商.支付宝等均已全面支持mac os了),windows上的经典常用软件:qq.飞信.旺旺.有道词典.有道云笔 ...
- HP DL60 Gen9 安装CentOS 6.5
由于Gen 9的VID中自带RETHAT 5.X-7.0的驱动, 所以不需要制作驱动盘. 一, 准备工作 1. 制作 CentOS安装盘 2. 配置阵列, 开机过了自检后按F10. 自己看着配... ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)
主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:57:18 大家好,今天我们讲一下第14章combining models,这一章是联合模型,通过将多个模型以某种形式 ...
- 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)
在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现. 无论作为软件设计的高手.或者菜鸟,对于架构设计而言,均需要多次重构.取舍,以有利于整个软件项目的健康构建 ...
- ASP.NET 系列:单元测试
单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...