2118: 墨墨的等式

Description

墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N、{an}、以及B的取值范围,求出有多少B可以使等式存在非负整数解。

Input

输入的第一行包含3个正整数,分别表示N、BMin、BMax分别表示数列的长度、B的下界、B的上界。输入的第二行包含N个整数,即数列{an}的值。

Output

输出一个整数,表示有多少b可以使等式存在非负整数解。

Sample Input

2 5 10
3 5

Sample Output

5

HINT

对于100%的数据,N≤12,0≤ai≤5*10^5,1≤BMin≤BMax≤10^12。

Source

【分析】

  看了好久题解,感觉好机智啊。。

  题目可以理解成经典的背包问题。只是他问你的是[L,R]区间中有多少个容积是恰好可以装满的。

  然后这个范围很大啊,传统的暴力当然是行不通的了。

  考虑一个可以被拼出来的x,他里面可以包含ai也可以不包含ai。设x%ai=b(0<=b<ai)

  那么其实x+ai都可以被拼出来,显然。

  所以我们只要对于一个b,求出最小的可以拼出来的x,那么一直加ai也是可以的。

  直接把不同的b算出来的答案加起来就好了。

  要证明的话只要说明两个东西:

  1、不重复性,对于不同的可以拼出的x1,x2,如果他们%ai不同,那就不会算重复。

    如果他们%ai相同,也不会算重复【233我在搞笑?】

  2、不遗漏性,对于可以拼出来的x1,有一个模对应的b,那么肯定会算到嘛= =【233

  所以就这样搞笑的证明了??

  【想出来的人思路真的很妙【我根本看不出是最短路啊ORZ。。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define LL long long
#define Maxm 7000100
#define Maxn 500010
#define INF 1000000000000LL int a[]; struct node
{
int x,y,next;
LL c;
}t[Maxm];int len=; // vector<int > e[Maxn],c[Maxn]; int first[Maxn]; void ins(int x,int y,LL c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
} LL dis[Maxn];
bool inq[Maxn];
queue<int > q;
void spfa()
{
int st=;
while(!q.empty()) q.pop();
memset(inq,,sizeof(inq));
// memset(dis,63,sizeof(dis));
for(int i=;i<a[];i++) dis[i]=INF;
q.push(st);dis[st]=;inq[st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
// for(int i=0;i<e[x].size();i++)
// {
// int y=e[x][i];
if(dis[y]>dis[x]+t[i].c)
{
dis[y]=dis[x]+t[i].c;
// dis[y]=dis[x]+c[x][i];
while(!inq[y])
{
inq[y]=;
q.push(y);
}
}
}
inq[x]=;
q.pop();
}
} LL get_ans(LL x,LL y)
{
if(x<y) return ;
return (x-y)/a[]+;
} int main()
{
int n;
LL L,R;
scanf("%d%lld%lld",&n,&L,&R);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a++n);
memset(first,,sizeof(first));
for(int i=;i<=n;i++)
for(int j=;j<a[];j++)
{
ins(j,(j+a[i])%a[],a[i]);
}
spfa();
LL ans=;
for(int i=;i<a[];i++)
ans+=get_ans(R,dis[i])-get_ans(L-,dis[i]);
printf("%lld\n",ans);
return ;
}

WA了很久竟然是spfa打错了。。。

2017-01-13 19:05:54

【BZOJ 2118】 2118: 墨墨的等式 (最短路)的更多相关文章

  1. bzoj 2118 墨墨的等式 - 图论最短路建模

    墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...

  2. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  3. 【BZOJ 2118】 墨墨的等式(Dijkstra)

    BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...

  4. bzoj 2118: 墨墨的等式

    Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...

  5. bzoj 2118: 墨墨的等式 spfa

    题目: 墨墨突然对等式很感兴趣,他正在研究\(a_1x_1+a_2y_2+ ... +a_nx_n=B\)存在非负整数解的条件,他要求你编写一个程序,给定\(N,\{a_n\}\)以及\(B\)的取值 ...

  6. [图论训练]BZOJ 2118: 墨墨的等式 【最短路】

    Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...

  7. BZOJ2118墨墨的等式[数论 最短路建模]

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discus ...

  8. BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2944  Solved: 1206[Submit][Status][Discu ...

  9. 【BZOJ2118】墨墨的等式(最短路)

    [BZOJ2118]墨墨的等式(最短路) 题面 BZOJ 洛谷 题解 和跳楼机那题是一样的. 只不过走的方式从\(3\)种变成了\(n\)种而已,其他的根本没有区别了. #include<ios ...

随机推荐

  1. IIS 搭建

    1. 在打开程序功能里面,点击IIS安装.注意要选择适当的各种有用的服务.例如默认文档就需要安装非IIS下面的选项. 2. IIS部署网站可以参考网上的步骤.会遇到500处理程序“Extensionl ...

  2. 【BZOJ1093】【ZJOI2007】最大半联通子图 [DP][Tarjan]

    最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 一个有向图G=(V,E)称为 ...

  3. 前端&后端程序员必备的Linux基础知识

    一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么操作系统: 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石: 操作 ...

  4. 【洛谷 P3809】 【模板】后缀排序

    题目链接 先占个坑,以后再补. \(SA\)的总结肯定是要写的. 等理解地深入一点再补. #include <cstdio> #include <cstring> const ...

  5. css优先级机制

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.   1.important >(内联样式)Inline style  >(内部样式)Internal style sheet ...

  6. jq_$.extend和$.fn.extend插件开发和方法的封装

    --------杂谈-------- 随着使用的使用js和jq使用的越来越娴熟,也就是说日常产品经理给的一些需求,已经在自己的能力范围内了.空出来了一点时间,来研究如何优化你的代码, 不管是性能上,还 ...

  7. Linux 入门记录:十三、Linux 扩展权限

    一.默认权限 每一个终端都有一个 umask 属性,是用来确定新建文件或目录的默认权限的“掩码”(mask 有“掩码”的含义,至于 u,后面说). Linux 中一般有默认的权限掩码,使用命令 uma ...

  8. monkey测试===如何获取android app的Activity

    方法一(推荐): 手机连接adb,手机界面在需要取得activity的界面. 推荐使用该命令: adb shell dumpsys activity top | findstr ACTIVITY 获取 ...

  9. unbutu下Io language的解释器安装

    今晚看Io,然后要安装解释器,然后就记录下来了... 首先去官网下载 http://iolanguage.com 在页面下方的binaries那里找到自己系统对应的版本,我的是x64deb的,本来是下 ...

  10. 【sam复习】用sam实现后缀排序

    没错,一定是无聊到一定境界的人才能干出这种事情. 这个无聊的zcysky已经不满足于用后缀平衡树求sa了,他想用sam试试. 我们回顾下sam的插入过程,如果我们从最后一个state沿着suffix ...