原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2118

墨墨的等式

Description

墨墨突然对等式很感兴趣,他正在研究a1x1+a2x2+…+anxn=Ba1x1+a2x2+…+anxn=Ba_1x_1+a_2x_2+…+a_nx_n=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。

题解

完全背包拿暴力分相信大家都会,就不讲了。

首先,如果我们已经凑出xiai+xjaj...=pxiai+xjaj...=px_ia_i+x_ja_j...=p,那么我们一定能凑出(xi+1)ai+xjaj...=p+ai(xi+1)ai+xjaj...=p+ai(x_i+1)a_i+x_ja_j...=p+a_i,所以对于某个元素aiaia_i,设x∈[0,ai),p′ mod ai=xx∈[0,ai),p′modai=xx\in [0,a_i),p'\ mod\ a_i=x ,当我们找到满足条件的的最小的p’时,我们一定可以凑出ai+x,2ai+x,3ai+x...ai+x,2ai+x,3ai+x...a_i+x,2a_i+x,3a_i+x...,进而我们就可以计算出在[1,R][1,R][1,R]中满足对aiaia_i取模得到xxx的数的个数。

为了减少复杂度,我们不妨把ai" role="presentation" style="position: relative;">aiaia_i取为a中最小的元素aminamina_{min}。接下来我们就可以建图,节点0∼amin0∼amin0\sim a_{min}表示对aminamina_{min}取模的余数,dis[i]表示满足p′ mod amin=ip′modamin=ip'\ mod\ a_{min}=i的p’的最小值。建边时,对于每个节点j,我们枚举所有aiaia_i,连一条j→(j+ai) mod aminj→(j+ai)modaminj\to (j+a_i)\ mod\ a_{min}的有向边即可。

这道题博主在洛谷上Dijkstra莫名被卡,SPFA加register才A掉,然而BZOJ上Dijkstra还比SPFA快1000ms。。。

记得左区间减一。

代码

Dijkstra:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=5e5+5;
struct sd{ll n,d;bool operator <(const sd &b)const{return b.d<d;}
};
ll n,b1,b2,dis[M],a[M],minn=1e17;
vector<sd>edge[M];
bool vis[M];
priority_queue<sd>dui;
void in()
{scanf("%lld%lld%lld",&n,&b1,&b2);for(int i=1;i<=n;++i)scanf("%lld",&a[i]),minn=min(a[i],minn);
}
void dijkstra()
{for(int i=1;i<minn;++i)dis[i]=1e17;dis[0]=0;dui.push((sd){0,0});sd f,t;while(!dui.empty()){f=dui.top();dui.pop();if(vis[f.n])continue;vis[f.n]=1;for(int i=edge[f.n].size()-1;i>=0;--i){t=edge[f.n][i];if(!vis[t.n]&&dis[t.n]>dis[f.n]+t.d){dis[t.n]=dis[f.n]+t.d;dui.push((sd){t.n,dis[t.n]});}}}
}
void ac()
{for(int i=0;i<minn;++i)for(int j=1;j<=n;++j)if(a[j]%minn!=0)edge[i].push_back((sd){(i+a[j])%minn,a[j]});dijkstra();ll ans=0;b1--;for(int i=0;i<minn;++i){if(dis[i]<=b1)ans-=(b1-dis[i])/minn+1;if(dis[i]<=b2)ans+=(b2-dis[i])/minn+1;}printf("%lld",ans);
}
int main()
{in();ac();return 0;
}

SPFA:

#include<bits/stdc++.h>
#define ll long long
#define R register
using namespace std;
const int M=5e5+5;
struct sd{ll n,d;
};
ll n,b1,b2,dis[M],a[M],minn=1e17;
vector<sd>edge[M];
bool vis[M];
queue<int>dui;
void in()
{scanf("%lld%lld%lld",&n,&b1,&b2);for(int i=1;i<=n;++i)scanf("%lld",&a[i]),minn=min(a[i],minn);
}
void SPFA()
{memset(dis,53,sizeof(dis));dis[0]=0;dui.push(0);int f;sd t;R int i;while(!dui.empty()){f=dui.front();dui.pop();vis[f]=0;for(i=edge[f].size()-1;i>=0;--i){sd t=edge[f][i];if(dis[t.n]>dis[f]+t.d){dis[t.n]=dis[f]+t.d;dui.push(t.n);}}}
}
void ac()
{R int i,j;for(i=0;i<minn;++i)for(j=1;j<=n;++j)if(a[j]%minn!=0)edge[i].push_back((sd){(i+a[j])%minn,a[j]});SPFA();ll ans=0;b1--;for(i=0;i<minn;++i){if(dis[i]<=b1)ans-=(b1-dis[i])/minn+1;if(dis[i]<=b2)ans+=(b2-dis[i])/minn+1;}printf("%lld",ans);
}
int main()
{in();ac();return 0;
}

BZOJ2118[国家集训队] 墨墨的等式相关推荐

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

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

  2. BZOJ 2118: 墨墨的等式(最短路dijkstra+堆)

    2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MB Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存 ...

  3. p2371bzoj2118 墨墨的等式

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

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

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

  5. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  6. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  7. BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2156 是 hydro 的 BZOJ ...

  8. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  10. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到 ...

最新文章

  1. 陈春花:管理到底是什么?
  2. maximo 工作流实现代码
  3. 点击链接微信html代码怎么写,html5微信分享代码怎么写呢?
  4. opencv imread
  5. 【Linux】一步一步学Linux——apropos命令(230)
  6. 程序员的崩溃,是从“你薪资比我高”开始的!
  7. 除了html 还有什么页面,HTML页面布局有哪些?
  8. 地址解析协议ARP:ARP欺骗
  9. java中的堆和栈_实例理解Java中的堆和栈
  10. 基建管控系统_基建管控系统在电网建设中的应用
  11. 火狐浏览器Firebug控制台显示本页面不包含 javascript的解决方案 debugger 无效解决方案
  12. android 开源fc模拟器_安卓FC模拟器NESemu
  13. C# 传递数组参数_一维数组_二维数组
  14. NCT青少年编程能力等级测试Python编程二级-模拟卷(含答案)
  15. 基于统计学习---面向新闻的发生地与提及地检测
  16. 一个前端工程师的基本修养
  17. 可折叠设备的桌面模式
  18. 开发一个会叫自己“爷爷”的“孙子”,是一种什么样的体验?
  19. 2021-2027全球与中国梨花油市场现状及未来发展趋势
  20. 分享五年码农生涯历程经验及2018总结 | 掘金年度征文

热门文章

  1. Httpx:针对HTTP的安全研究工具
  2. Raki的读paper小记:SimCSE: Simple Contrastive Learning of Sentence Embeddings
  3. 快速突破面试算法之数组与矩阵篇
  4. 两千万像素分辨率是多少_一亿像素究竟有无意义?荣耀红米为它“打”的火热...
  5. PostgreSQL 之 CREATE FUNCTION
  6. javascript 原型链实现继承简单例子
  7. JAVA设计模式---单例模式的几种实现方式比较
  8. 我做的第一个PHP网站
  9. 如何安全地终止线程interrupt()、isInterrupted()、interrupted()的区别与使用
  10. solr的索引库配置