洛谷P2371 [国家集训队]墨墨的等式
P2371 [国家集训队]墨墨的等式
题目描述
墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=Ba_1x_1+a_2y_2+…+a_nx_n=Ba1x1+a2y2+…+anxn=B 存在非负整数解的条件,他要求你编写一个程序,给定N、{an}、以及B的取值范围,求出有多少B可以使等式存在非负整数解。
输入输出格式
输入格式:
输入的第一行包含3个正整数,分别表示NNN 、BMinB_{Min}BMin 、BMaxB_{Max}BMax 分别表示数列的长度、B的下界、B的上界。
输入的第二行包含N个整数,即数列{an}的值。
输出格式:
输出一个整数,表示有多少b可以使等式存在非负整数解。
输入输出样例
输入样例#1:
2 5 10
3 5
输出样例#1:
5
说明
对于20%的数据,$N≤5N \le 5N≤5 ,1≤BMin≤BMax≤101 \le B_{Min} \le B_{Max} \le 101≤BMin≤BMax≤10 $。
对于40%的数据,$N≤10N \le 10N≤10 ,1≤BMin≤BMax≤1061 \le B_{Min} \le B_{Max} \le 10^61≤BMin≤BMax≤106 $。
对于100%的数据,\(N≤12N \le 12N≤12 ,0≤ai≤5∗1050 \le a_i \le 5*10^50≤ai≤5∗105 ,1≤BMin≤BMax≤10121 \le B_{Min} \le B_{Max} \le 10^{12}1≤BMin≤BMax≤1012\) 。
题解
神题。
先做转化,求\([l,r]\)内\(B\)的个数等价于\([0,r] - [0,l - 1]\)的个数。
从\(a\)中找到一个最小的非零数\(mi\),全部膜\(mi\)。
可以发现若\(p\)能被拼出,那么\(p + mi\)也能被拼出。
所有的答案\(B\)可以按照膜\(p\)的值分为\(p\)组,我们找到这\(p\)组里每一组最小的数即可推算其他数的个数(这些组在数论上叫剩余系)。
怎么求呢?
最短路!
对于每一个可能的\(mod p\)的余数建一个点,根据\(a\)的值连边,边权是对应\(a\)值。
注意空间和\(long long\)。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a < b ? a : b;}
inline void swap(long long &x, long long &y){long long tmp = x;x = y;y = tmp;}
inline void read(long long &x)
{
x = 0;char ch = getchar(), c = ch;
while(ch < '0' || ch > '9') c = ch, ch = getchar();
while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
if(c == '-') x = -x;
}
const long long INF = 0x3f3f3f3f3f3f3f3f;
struct Edge
{
long long u,v,w,nxt;
Edge(long long _u, long long _v, long long _w, long long _nxt){u = _u, v = _v, w = _w, nxt = _nxt;}
Edge(){}
}edge[4000000];
long long head[500010], cnt;
inline void insert(long long a, long long b, long long c)
{
edge[++ cnt] = Edge(a, b, c, head[a]), head[a] = cnt;
}
long long n, l, r, a[20], d[500010], vis[500010], mi, ans;
struct Node
{
long long v, w;
Node(long long _v, long long _w){v = _v, w = _w;}
};
struct cmp
{
bool operator()(Node a, Node b){return a.w > b.w;}
};
std::priority_queue<Node, std::vector<Node>, cmp> q;
void dij()
{
memset(d, 0x3f, sizeof(d)), d[1] = 0;
q.push(Node(1, 0));
while(q.size())
{
Node now = q.top();q.pop();
if(vis[now.v]) continue; vis[now.v] = 1;
for(long long pos = head[now.v];pos;pos = edge[pos].nxt)
{
long long v = edge[pos].v;
if(vis[v]) continue;
if(d[v] > d[now.v] + edge[pos].w)
d[v] = d[now.v] + edge[pos].w, q.push(Node(v, d[v]));
}
}
}
int main()
{
read(n), read(l), read(r), mi = INF;
for(long long i = 1;i <= n;++ i) read(a[i]), mi = a[i] ? min(mi, a[i]) : mi;
for(long long i = 1;i <= mi;++ i)
for(long long j = 1;j <= n;++ j)
{
if(a[j] == 0) continue;
insert(i, (i - 1 + a[j] + mi) % mi + 1, a[j]);
}
dij();
for(long long i = 1;i <= mi;++ i)
{
if(r >= d[i]) ans += (r - d[i]) / mi + 1;
if(l - 1>= d[i]) ans -= (l - 1 - d[i]) / mi + 1;
}
printf("%lld", ans);
return 0;
}
洛谷P2371 [国家集训队]墨墨的等式的更多相关文章
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- 洛谷 P1407 [国家集训队]稳定婚姻 解题报告
P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
随机推荐
- 尚学python课程---15、python进阶语法
尚学python课程---15.python进阶语法 一.总结 一句话总结: python使用东西要引入库,比如 json 1.python如何创建类? class ClassName: :以冒号结尾 ...
- HDU 4325 离散化+树状数组 或者 不使用树状数组
题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...
- 添加ASP.NET AJAX控件工具集到VS2010的方法
在VS2010中Ajax控件只有5个,其实还有很多支持AJAX特定功能的服务器控件,微软是将这些控件当作开放源代码项目.所以没有集成到VS2010中.这些AJAX控件被称为ASP.NET AJAX控件 ...
- mac下xampp+vscode进行php程序调试
最近折腾公司的官网,是 php 做的,搭建调试环境做个记录,我用的是 mac 机. 1.下载最新的xampp,我的版本是XAMPP for OS X 5.6.31: 2.找到 php.ini,/App ...
- JS事件 什么是事件?JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。
什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...
- mysql的几种启动方式
mysql的四种启动方式: 1.mysqld 启动mysql服务器:./mysqld --defaults-file=/etc/my.cnf --user=root 客户端连接: mysql --de ...
- Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.1.0
android studio 3.0 出现此问题可能是因为 你的android studio 时脱机状态 无法下载资源 这时候你可以点击左上角分File->Other Settings-> ...
- Qt Creator配置
1.安装Git sudo apt install git 2.配置Git 用户和邮箱: git config --global user.name "xxx" git config ...
- python 之单例模式
单例模式1 单例=>只有一个单例2 静态方法+静态字段3 所有实例中等转的内容相同时 用单例模式class Sqllite: __instance=None def __init__(self) ...
- docker删除未使用到的镜像
docker image prune -a docker image prune -a -f #-f强制,不需要确认