题目传送门:bzoj2118 洛谷P2371

  这道题看了题解后才会的。。果然是国家集训队的神仙题,思维独特。

  首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每一个$ a_i $方程$ \sum_{i=1}^{n}a_ix_i=k $都必有非负整数解。于是若取$ Min=\min(a_i) $,那么对于任意$ j \in [0,min) $,若对于自然数数$ k $,$ \sum_{i=1}^{n}a_ix_i=k (k \equiv j (mod \ Min)) $有解,则对于一切自然数$ B>k(B \equiv j (mod \ Min)) $,方程$ \sum_{i=1}^{n}a_ix_i=k $都必有解。因此,我们只需对每一个$ j $求出对应的$ k $值。(我代码中实际求的是$ k/Min $,取$ Min $是为了让状态数尽可能小)

  但是,这个值怎么求呢?根据上文,若$ \sum_{i=1}^{n}a_ix_i=k $,则我们可以尝试将$ k $分别加上每一个$ a_i $得到新的合法数值。这其实相当于对于每一个$ i \in [1,n] $,从$ k $向$ (k+a_i)mod \ Min $连一条长度为$ a_i $的边。同时,我们要使$ k $尽可能小,所以要在原图中跑最短路求解。

  代码:

  dijkstra+堆(这个如果dijkstra写得不好在洛谷上会tle)

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000000
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 5010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
struct data{
int id,dis;
friend bool operator < (data a,data b){
return a.dis>b.dis;
}
};
std::priority_queue<data>heap;
struct edge{
int to,nxt,d;
}e[];
int fir[],mark[],dist[];
int a[];
int n,m,tot=;
ll l,r;
void add(int x,int y,int z){e[tot].to=y; e[tot].d=z; e[tot].nxt=fir[x]; fir[x]=tot++;}
void dij(int S)
{
memset(dist,0x3f,sizeof(dist));
memset(mark,,sizeof(mark));
data now; now.id=S; now.dis=; heap.push(now);
while(!heap.empty()){
now=heap.top(); heap.pop();
if(mark[now.id])continue;
mark[now.id]=; dist[now.id]=now.dis;
for(int i=fir[now.id];~i;i=e[i].nxt)
if(!mark[e[i].to]){
data tmp; tmp.id=e[i].to; tmp.dis=dist[now.id]+e[i].d;
heap.push(tmp);
}
// printf("A\n");
}
}
int main()
{
memset(fir,,sizeof(fir));
n=read(); l=read(); r=read();
int mn=inf;
for(int i=;i<=n;i++)
a[i]=read(),mn=min(mn,a[i]);
for(int i=;i<mn;i++)
for(int j=;j<=n;j++){
int nxt=i+a[j];
add(i,nxt%mn,nxt/mn);
}
dij();
// for(int i=0;i<mn;i++)printf("%d %d\n",i,dist[i]);
ll ans=;
for(int i=;i<mn;i++)
if(1ll*dist[i]*mn+i<=r){
ll L=max(dist[i]*mn+i,l),R=r;
if(L/mn<R/mn){
ans+=R/mn-L/mn-;
if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
if(L<=R/mn*mn+i&&R/mn*mn+i<=R)++ans;
}
else if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
// printf("*** %d %lld %lld %lld\n",i,ans,L,R);
}
printf("%lld\n",ans);
}

bzoj2118&&洛谷P2371

  spfa(这个就很清真了,跑得飞快)

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000000
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 5010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
using namespace std;
struct edge{
int to,nxt,d;
}e[];
int fir[],inq[],dist[];
int q[];
int a[];
int n,m,tot=;
ll l,r;
void add(int x,int y,int z){e[tot].to=y; e[tot].d=z; e[tot].nxt=fir[x]; fir[x]=tot++;}
void spfa(int S)
{
memset(dist,0x3f,sizeof(dist));
memset(inq,,sizeof(inq));
int h=,t=; q[]=S; inq[S]=; dist[S]=;
while(h<=t){
for(int i=fir[q[h]];~i;i=e[i].nxt)
if(dist[q[h]]+e[i].d<dist[e[i].to]){
dist[e[i].to]=dist[q[h]]+e[i].d;
if(!inq[e[i].to]){
q[++t]=e[i].to; inq[e[i].to]=;
}
}
inq[q[h++]]=;
}
}
int main()
{
memset(fir,,sizeof(fir));
n=read(); l=read(); r=read();
int mn=inf;
for(int i=;i<=n;i++)
a[i]=read(),mn=min(mn,a[i]);
for(int i=;i<mn;i++)
for(int j=;j<=n;j++){
int nxt=i+a[j];
add(i,nxt%mn,nxt/mn);
}
spfa();
ll ans=;
for(int i=;i<mn;i++)
if(1ll*dist[i]*mn+i<=r){
ll L=max(dist[i]*mn+i,l),R=r;
if(L/mn<R/mn){
ans+=R/mn-L/mn-;
if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
if(L<=R/mn*mn+i&&R/mn*mn+i<=R)++ans;
}
else if(L<=L/mn*mn+i&&L/mn*mn+i<=R)++ans;
}
printf("%lld\n",ans);
}

bzoj2118&&洛谷P2371

【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)的更多相关文章

  1. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  2. 洛谷P2371 [国家集训队]墨墨的等式

    P2371 [国家集训队]墨墨的等式 题目描述 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=Ba_1x_1+a_2y_2+-+a_nx_n=Ba1​x1​+a2​y2​+-+a ...

  3. 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)

    洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...

  4. 【BZOJ2763/洛谷p4563】【分层图最短路】飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4630  Solved: 1797[Submit][Stat ...

  5. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  6. 洛谷——P2371 EXCEEDED WARNING C(50)

    P2371 EXCEEDED WARNING C 题目背景 第三道溢出警告... 机(wei)智(suo)的TMXi又搬题来坑大家了... 注意时空限制[坏笑] 题目描述 [li]1949年,阿三的数 ...

  7. 洛谷 P1876 开灯(思维,枚举,规律题)

    P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编 ...

  8. 洛谷 P2622 关灯问题II(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...

  9. 洛谷 p1164 小A点菜 【dp(好题)】 || 【DFS】 【恰好完全装满】

    题目链接:https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. u ...

随机推荐

  1. 3、easyUI-创建 CRUD可创建展开行明细编辑dataGrid(表格)

    同样在上一节中讲到可以编辑的表格,现在讲一般用到的最后一个datagrid(表格)相关的展开明细可编辑的表格: 第三中表格主要应用场景在:列出表格信息,然后点击可以查看详细信息(此处是全部可以编辑,可 ...

  2. Django项目笔记:sessions处理以及复杂对象序列化

    前言:一点题外话 我发现,不更新博客的时候,不是非常忙,就是效率非常低.最近没怎么更新博客,原因是第二种= =.惭愧惭愧. 今天效率出奇的高,一天时间把PassNote后端的接口全部写完了,Djang ...

  3. kali linux下更新163源可使用RPM

    在没有安装163源之前 更新163源 1.在终端输入#leafpad /etc/apt/sources.list 2.打开网页 http://mirrors.163.com/.help/debian. ...

  4. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  5. iOS学习笔记(一)——ios搭建开发环境

    好久就想试水IOS开发了,由于开发环境限制,一直局限于理论和虚拟机,近来入手了MacBook Pro,也来尝尝鲜,笔者也是现学现总结,如果有不足,请指正. IOS开发必备MAC OS X 另加一部iP ...

  6. ofstream和ifstream详细用法

    ASCII和二进制文件的输入输出 First:包含头文件#include <fstream> ASCII输入: 首先要创建一个in-stream对象:ifstream fin(" ...

  7. 关于string的replace方法

    今天写代码遇见一个小问题,就是当string  a,b,c,d当腰删除b的时候如果replace(“a”,"");会造成,b,c,d   所以得replace("a&qu ...

  8. 封装AFNetworking

    用了一下AFNetworking感觉比ASIHttprequest 真心好用一些,因为我还是个初学者吧,很多ASIHttprequest 的功能还没有用到,与ASIHttprequest 不用的是AF ...

  9. JavaScript数据结构与算法-栈练习

    栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...

  10. testlink1.9.3测试管理工具安装

    一.下载testlink1.9.3rar安装包 下载地址:http://download.csdn.net/download/u010082992/7678491 二.安装IIS 在Server 20 ...