p2371bzoj2118 墨墨的等式
传送门(bzoj)
题目
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N、{an}、以及B的取值范围,求出有多少B可以使等式存在非负整数解。
Input
输入的第一行包含3个正整数,分别表示N、BMin、BMax分别表示数列的长度、B的下界、B的上界。输入的第二行包含N个整数,即数列{an}的值。
Output
输出一个整数,表示有多少b可以使等式存在非负整数解。
Sample Input
3 5
Sample Output
HINT
对于100%的数据,N≤12,0≤ai≤5*10^5,1≤BMin≤BMax≤10^12。
分析
我们先对输入的a进行排序,我们设第一个非零数为a1,我们不难得出如果ka1+b>=BMin,那对于(k+1)a1+b,(k+2)a1+b......(k+m)a1+b同样满足此条件,这里的b就是BMin%a1的余数。所以我们的任务就可以转换为求对于[0,a1-1]的b对应的k的最小值,然后求出在BMax范围内的k的总个数就行了。然后我们考虑建图跑最短路求最小值,设我们有一个余数bi,那通过bi可到达的点就依次(bi+a2)%a1,(bi+a3)%a2......那我们不难得出所到达的点比原来的点多了(bi+aj)/a1个a1,所以这之间的距离就是这个数。既然我们建出了图,那我们就可以最短路求出kmin了,之后经过简单处理就可以求出答案
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const long long inf=1e12+7;
long long vis[1000100],kmin[1000100],a[5000],n,m,bmin,bmax;
priority_queue<pair<long long,long long> >q;
vector<pair<long long,long long> >v[1000100];
inline void read(long long &x){
char s;s=getchar();long long f=1;x=0;while(s>'9'||s<'0'){f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=(x<<3)+(x<<1)+(s-'0');s=getchar();}x*=f;
}
inline void go(int r){
long long i,j,k;
for(i=1;i<r;i++)kmin[i]=inf;
q.push(make_pair(0,0));
while(!q.empty()){
long long x=q.top().second;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(i=0;i<v[x].size();i++){
long long y=v[x][i].first,z=v[x][i].second;
if(kmin[x]+z<kmin[y]){
kmin[y]=kmin[x]+z;
q.push(make_pair(-kmin[y],y));
}
}
}
}
int main(){
long long i,j,k,wh=0,ans=0,x,y;
read(n);read(bmin);read(bmax);
for(i=1;i<=n;i++)
read(a[i]);
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
if(a[i]!=0){
wh=i;
break;
}
if(!wh){puts("0");return 0;}
for(i=wh+1;i<=n;i++)
for(j=0;j<a[wh];j++){
v[j].push_back(make_pair((j+a[i])%a[wh],(j+a[i])/a[wh]));
}
go(a[wh]);
for(i=0;i<a[wh];i++)
if(kmin[i]<inf){
x=(bmax-i)/a[wh];
y=(bmin-i-1)/a[wh]+1;
if(x<kmin[i])continue;
ans+=(x-max(kmin[i],y)+1);
}
cout<<ans<<endl;
return 0;
}
转载于:https://www.cnblogs.com/yzxverygood/p/9088414.html
p2371bzoj2118 墨墨的等式相关推荐
- BZOJ2118墨墨的等式[数论 最短路建模]
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1317 Solved: 504 [Submit][Status][Disc ...
- BZOJ 2118: 墨墨的等式(最短路dijkstra+堆)
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MB Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存 ...
- bzoj 2118 墨墨的等式 - 图论最短路建模
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+-+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...
- android 补签控件,墨墨背单词怎么补签 看完你就懂了
现在手机的普及让不少用户在手机上面学习英语,而墨墨背单词就是一款专业的英语学习软件,它可以提醒用户每日记忆单词,还有督促你学习的签到系统,通过每日的签到不仅可以提高你学习英语的动力还能免费提升每日学习 ...
- 已拿字节、腾讯、墨墨 offer,音视频开发进阶指南pdf
背了多少单词 (更慌了,随口说100个左右) 怎么知道有墨墨这个app的 (同学介绍) 你简历说你自己心思缜密,但是你简历上的句子的标点符号有问题啊.(emmm) 项目的UI问题 技术 : JavaS ...
- 获取墨墨背单词里面的单词书中的单词
首先,其实是直接尝试抓包获取的,不过在抓包的信息中没发现类似的内容,然后就去百度了以下,发现还是有聪明人. 把下载的 apk 文件解压缩一下,把里面的 assets 文件夹里面的 maimemo.v3 ...
- 墨墨背单词刷分享链接访问量(动态获取IP代理池)
墨墨背单词 分享链接刷点击量(自动获取最新IP代理池方式),以提高单词上限. 运行方式 1 Python 环境运行main.py 1.1 克隆本仓库 Github仓库 Momo-Share-Fresh ...
- app使用经验分享——墨墨背单词
墨墨背单词 大家好,今天推荐一款干货背单词软件--墨墨背单词,相信大家对它并不陌生,它在华为应用市场上的评分是4.9,安装次数也是破1亿了. 一.设置每日学习量 点击右下角"我的" ...
- 墨墨背单词 无限版本
[Android] 墨墨背单词3.8.40,9999单词上限版 https://www.52pojie.cn/thread-1300054-1-1.html
最新文章
- 网络主机托管的特点和优点_主机托管有哪些特点和优点
- cgo linux arm,Golang交叉编译各个平台的二进制文件
- K8S部署工具:KubeOperator集群规划-手动模式
- c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!
- [DLX反复覆盖] hdu 2828 Lamp
- php数据访问层,对数据访问层第一种实现(Acc+SQL)的重构
- Winsock编程补遗
- 数字接口系列文章:SPI 总线
- restframework 第一天
- python怎么读写文件-一文看懂Python文件的读取写入操作,建议收藏-bak文件怎么打开...
- paip.ollydbg 常用流程以及找到子程序调用地址
- 现代通信原理:第七章部分习题答案
- FPGA入门 Xilinx暑期学校学习Day4
- 电路中的电阻_电感_电容的特性
- 天龙八部3d最新服务器,天龙八部3D妙笔生花新服务器开启公告
- 洛谷P1724 东风谷早苗
- opencv抠出圆形区域_用OpenCV检测圆形区域(包含大量小对象)
- 為Raspberry Pi 安裝Raspbian系統的詳細步驟 (Mac OS版本)
- c语言第三章程序设计实训
- 几种常用的权重初始化方法
热门文章
- 迅捷cad_迅捷属性
- python编程示例_Python套接字编程–服务器,客户端示例
- Java开发中出现OOM的常见原因有哪些?
- 开课吧:Web开发要学习哪些基础知识?
- 开课吧:数据分析师常用的分析方法有哪些?
- Azure: 给 ubuntu 虚机挂载数据盘
- 一键安装thrift-0.9.0的脚本
- 创业记-我的技术选型
- Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]
- 铝电解电容总结[转]