BZOJ.2118.墨墨的等式(思路 最短路Dijkstra 按余数分类)
题意可以看做,用\(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 按余数分类)的更多相关文章
- 【BZOJ 2118】 墨墨的等式(Dijkstra)
BZOJ2118 墨墨的等式 题链:http://www.lydsy.com/JudgeOnline/problem.php?id=2118 Description 墨墨突然对等式很感兴趣,他正在研究 ...
- 【BZOJ 2118】墨墨的等式
http://www.lydsy.com/JudgeOnline/problem.php?id=2118 最短路就是为了找到最小的$x$满足$x=k×a_{min}+d,0≤d<a_{min}$ ...
- 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)
题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...
- bzoj 2118 墨墨的等式 - 图论最短路建模
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...
- 【BZOJ 2118】 2118: 墨墨的等式 (最短路)
2118: 墨墨的等式 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求 ...
- 数论+spfa算法 bzoj 2118 墨墨的等式
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1283 Solved: 496 Description 墨墨突然对等式很感兴 ...
- [图论训练]BZOJ 2118: 墨墨的等式 【最短路】
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- bzoj 2118: 墨墨的等式
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- bzoj 2118: 墨墨的等式 spfa
题目: 墨墨突然对等式很感兴趣,他正在研究\(a_1x_1+a_2y_2+ ... +a_nx_n=B\)存在非负整数解的条件,他要求你编写一个程序,给定\(N,\{a_n\}\)以及\(B\)的取值 ...
随机推荐
- [转]Linux下的链接脚本基础
[转]http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 1. 前言 (1)每一个链接过程都由链接脚本(linke ...
- python用win32pdh模块查看进程信息
import win32pdh def get_processes(): win32pdh.EnumObjects(None, None, win32pdh.PERF_DETAIL_WIZARD) # ...
- pom.xml的第一行报错
第一行:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or ...
- lamp环境搭建之配置apache与fpm方式的php
配置apache-2.4.9与fpm方式的php-5.4.26 一.apache.MySQL的安装参考<编译安装lamp环境> http://blog.csdn.net/reblue520 ...
- IOS支持多国语言
- CSS Grid 布局
CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...
- python+selenium九:ddt数据驱动
第一种,测试数据放在Excel里面 test_Login: import unittestimport timeimport ddtimport osfrom selenium import webd ...
- MarkDown常用语法及word转MarkDown
介绍 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...
- Sony笔记本
关机的情况下按键盘 f2键.进菜单选更改 bios设置 修改 3个地方 进bios右移 boot上 第一项 ufei改成 legacy external device改成enabled 下面启动顺序改 ...
- wmiprvse.exe cpu占用高怎么解决
可以通过在注册表中设置,来禁用该服务,具体步骤如下: (1)按下“Win+R”组合键呼出运行,在框中输入“CMD”按下回车打开“命令提示符”: (2)在命令提示符中输入:r ...