题目链接

题意可以看做,用\(a_1,a_2,...,a_n\),能组成多少个\([L,R]\)中的数。

(40分就是个完全背包)

首先如果\(k*a_i+x\)可以组成,那么\((k+1)*a_i+x\)自然也可以组成(\(k\geq 0,0\leq x<a_i\))。

即我们选取一个\(a_i\)做模数,若\(d\equiv x(mod\ a_i)\),则\(d+a_i\equiv x(mod\ a_i)\),那么对于当前余数\(x\)我们可以算出\([0,R]\)中有多少个数模\(a_i\)为\(x\)(只能由\(d\)每次加\(a_i\))。对于所有余数算一次就能得到答案。

另外这个\(d\)需要是满足模\(a_i\)为\(x\)的最小的数(用\(n\)个数组合得到)。考虑如何对每个余数求这个\(d\)。

因为每次是枚举\(n\)个数转移(加上再取模),且状态可以用数组存,要求最小,联想到最短路。

\(dis[x]\)表示满足模\(a_i\)为\(x\)的能组成的最小的数。那么余数为\(0\)的最小的数自然是\(0\),即\(dis[0]=0\)。然后SPFA或Dijkstra。

至于\(a_i\),取最小的吧。这样图中的点数自然最少。(当然取哪个是任意的,因为最后统计答案时的\(a_i\)也是这个\(a_i\))

如果物品有下限限制,可以把边界先减掉,再这么求。

//9480kb	1792ms(慢啊→_→)
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mp std::make_pair
#define pr std::pair<LL,int>
typedef long long LL;
const int N=5e5+5; int n,mod,A[N];
LL dis[N];
std::priority_queue<pr> q; inline LL read()
{
LL now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void Dijkstra()
{
static bool vis[N]; memset(dis,0x3f,sizeof dis);
dis[0]=0, q.push(mp(0,0));
while(!q.empty())
{
int x=q.top().second; q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=1,v; i<=n; ++i)
if(dis[v=(x+A[i])%mod]>dis[x]+A[i])
q.push(mp(-(dis[v]=dis[x]+A[i]),v));
}
}
inline LL Calc(LL x)
{
LL ans=0;
for(int i=0; i<mod; ++i)
if(dis[i]<=x) ans+=(x-dis[i])/mod+1;//还有个dis[i]
return ans;
} int main()
{
n=read(); LL L=read(),R=read();
int cnt=0; mod=N;
for(int i=1; i<=n; ++i)
if(!(A[++cnt]=read())) --cnt;//忽略0
else mod=std::min(mod,A[cnt]);
n=cnt, Dijkstra();
printf("%lld\n",Calc(R)-Calc(L-1)); return 0;
}

BZOJ.2118.墨墨的等式(思路 最短路Dijkstra 按余数分类)的更多相关文章

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

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

  2. 【BZOJ 2118】墨墨的等式

    http://www.lydsy.com/JudgeOnline/problem.php?id=2118 最短路就是为了找到最小的$x$满足$x=k×a_{min}+d,0≤d<a_{min}$ ...

  3. 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)

    题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...

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

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

  5. 【BZOJ 2118】 2118: 墨墨的等式 (最短路)

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

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

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

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

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

  8. bzoj 2118: 墨墨的等式

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

  9. bzoj 2118: 墨墨的等式 spfa

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

随机推荐

  1. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  2. linux regulator之浅见【转】

    转自:http://blog.csdn.net/batoom/article/details/17081651 1: 校准器的基本概念 所谓校准器实际是在软件控制下把输入的电源调节精心输出. Regu ...

  3. python获取当前环境的编码

    # coding:gbk import sys import locale def p(f): print '%s.%s(): %s' % (f.__module__, f.__name__, f() ...

  4. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  5. root权限使用vim不能修改权限

    1.背景: 有时候我们会发现使用root权限不能修改某个文件,大部分原因是曾经使用chattr将文件锁定了 2.chattr命令介绍: 用来改变文件属性,能防止root用户误删文件等作用 3.使用方法 ...

  6. JavaScript 使用 mediaDevices API 选择摄像头

    大多数智能手机都有前置和后置摄像头,当你在创建视频应用时你可能想要选择或者切换前置.后置摄像头. 如果你开发的是一款聊天应用,你很可能会想调用前置摄像头,但如果你开发的是一款拍照软件,那么你会更倾向于 ...

  7. OneNET麒麟座应用开发之六:与气体质量流量控制器通讯

    气体质量流量控制器,简称MFC,通常用于在各种检测中,计量气体的流量.在我们的大气环境数据采集站中,要让气流保持稳定,这样才能准确的获取PM25的数据. 我们采用的气体质量流量控制器具备串口通讯功能, ...

  8. C++ code:向量操作之添加元素

    读入一个文件aaa.txt的数据到向量中,文件中是一些整数(个数未知).要判断向量中的元素有多少个两两相等的数对. 代码如下: #include<iostream> #include< ...

  9. 【ES】学习5-全文搜索

    全文搜索两个最重要的方面是:相关性, 分析. 一旦谈论相关性或分析这两个方面的问题时,我们所处的语境是关于查询的而不是过滤. match:单个词查询 GET /my_index/my_type/_se ...

  10. hdu1024线性dp

    /* dp[i][j]表示取第i个数时分成了j块 要么是将第i个数加入j块中的最后一块,要么是自成一块,加上前面j-1块的和 状态转移方程: dp[i][j]=max(dp[i-1][j]+a[i], ...