P2371 [国家集训队]墨墨的等式

题目描述

墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=Ba_1x_1+a_2y_2+…+a_nx_n=Ba1​x1​+a2​y2​+…+an​xn​=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 [国家集训队]墨墨的等式的更多相关文章

  1. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  2. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  3. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  4. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  5. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  6. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

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

  7. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  8. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  9. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

随机推荐

  1. post请求传文件

    public static JSONObject doFormDataPost(File file, String sURL) throws IOException { HttpClient cont ...

  2. P1910 L国的战斗之间谍

    P1910 L国的战斗之间谍 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:“知己知彼,百战不殆”.L国的指挥官想派出间谍前往I国,于是,选人工作就落到了你身上. 你现在有N个人选,每个 ...

  3. Python爬虫-《神雕侠侣》

    Python3.5 爬取<神雕侠侣>http://www.kanunu8.com/wuxia/201102/1610.html 武侠迷,所以喜欢爬取武侠小说 #!/usr/bin/pyth ...

  4. sshpass批量分发ssh秘钥

    首先安装sshpass: yum -y install sshpass 单条命令: sshpass -p“password” ssh-copy-id -i /root/.ssh/id_rsa.pub ...

  5. 【python】并集交集

    set是用来去重的. 在list里使用union函数.这种方式不适用于元素为字典的. list(set(a)^set(b)) 这是求差集 所以交集就是并集和ab的差集. import random d ...

  6. 一些CSS3新技术

    前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览器专有属性.选择器(属性选择器.连字符.伪类.伪元素).RGBA ...

  7. iOS开发系列-应用程序之间跳转

    概述 常见的涉及到应用程序之间的跳转场景,比如社交分享.支付宝.微信支付.链接跳转到应用. 在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可. 统一资源定位符 URL(统一资源定位 ...

  8. JS事件 鼠标经过事件(onmouseover)鼠标经过事件,当鼠标移到一个对象上时,该对象就触发onmouseover事件,并执行onmouseover事件调用的程序。

    鼠标经过事件(onmouseover) 鼠标经过事件,当鼠标移到一个对象上时,该对象就触发onmouseover事件,并执行onmouseover事件调用的程序. 现实鼠标经过"确定&quo ...

  9. MAP(Mean Average Precision)平均精度均值

    wrong 0 2 right 1 / 2 3 right 2 / 3 4 wrong 0 5 right 3 / 5 6 wrong 0 7 wrong 0 8 wrong 0 9 right 4 ...

  10. 用shell脚本执行php删除缓存文件

    <?php #定义删除路径//服务器缓存目录的路径 $path = '/www/wwwroot/****/data/runtime'; #调用删除方法 deleteDir($path); fun ...