题解 数列 及exgcd总结
自闭了……考场上exgcd打错然后对着屏幕自闭了一个小时不知道它为什么解得不对
开始恶补:
对于方程 \(a*x+b*y=c\) ,就等价于 \(a*x \equiv c\pmod{b}\)
首先它有解的条件是 \(c \mid gcd(a, b)\)
然后exgcd可以用来求一组 \(x, y\) 满足 \(a*x+b*y=gcd(a, b)\)
所以把解出来的 \(x, y\) 除gcd再乘上c就可以得到一组解
然后在 \(gcd(a, b)=1\) 的条件下解集为 \((a+k*b, b+k*a)\)
特别注意这里的 \(gcd(a, b)=1\) ,我被这玩意坑了半天
对应到这道题里,要求的就是 \(min\{abs(x)+abs(y)\}\)
按 \(x, y\) 的正负分情况讨论,让 \(abs(x-k*b)+abs(y+k*a)\) 尽量变小
具体来说,当 \(x \geqslant 0, y \geqslant 0\) 时,考虑 \(a, b\) 的大小关系
可以发现要让大的那个系数为负,比较 \(x\) 是最小的那个正数和是最大的那个负数的大小
其它情况类似
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
//#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n; ll a, b;
ll x[N], ans;
ll exgcd(ll a, ll b, ll& x, ll& y) {
if (!b) {x=1, y=0; return a;}
ll g=exgcd(b, a%b, y, x);
y-=(a/b)*x;
return g;
}
signed main()
{
n=read(); a=read(); b=read();
if (a>b) swap(a, b);
ll x1, y1;
ll g=exgcd(a, b, x1, y1);
a/=g, b/=g;
//cout<<"xy: "<<x1<<' '<<y1<<endl;
for (int i=1; i<=n; ++i) x[i]=read();
for (int i=1; i<=n; ++i) {
//cout<<i<<": "<<endl;
if (x[i]%g) {puts("-1"); return 0;}
ll x2=x[i]*x1/g, y2=x[i]*y1/g, k=llabs(x2/b);
//cout<<"xyk: "<<x2<<' '<<y2<<' '<<k<<endl;
if (x2>=0 && y2>=0) ans+=min(llabs(x2-k*b)+llabs(y2+k*a), llabs(x2-(k+1)*b)+llabs(y2+(k+1)*a));
else if (x2<=0 && y2>=0) ans+=min(llabs(x2+k*b)+llabs(y2-k*a), llabs(x2+(k+1)*b)+llabs(y2-(k+1)*a));
else if (x2>=0 && y2<=0) ans+=min(llabs(x2-k*b)+llabs(y2+k*a), llabs(x2-(k+1)*b)+llabs(y2+(k+1)*a));
else puts("error");
}
printf("%lld\n", ans);
return 0;
}
题解 数列 及exgcd总结的更多相关文章
- CSP-S考前各种idea题解乱堆
快要考试了我还是这么菜. 已经没有心思维护我的博客了.开一篇博文吧.可能会记得很乱. 这也许是我OI生涯的最后一篇博文了?? 肯定很长很长. 不可能的.谁知道什么时候我心态恢复就把上面两句话删掉开始在 ...
- Contest2178 - 2019-4-18 高一noip基础知识点 测试7 题解版
刚刚改完题,才有时间发题解 传送门 T1 exgcd裸题 对a,b跑exgcd,答案就是x*c/gcd(a,b),y*c/gcd(a,b) 不合法的情况:当且仅当c%gcd(a,b)!=0 代码 T2 ...
- 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】
推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n\) 顺序杀掉 \(n\ ...
- [HNOI2009]有趣的数列 题解(卡特兰数)
[HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满 ...
- BZOJ1500:[NOI2005]维修数列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1500 https://www.luogu.org/problemnew/show/P2042#su ...
- 洛谷 P4108 / loj 2119 [HEOI2015] 公约数数列 题解【分块】
看样子分块题应该做的还不够. 题目描述 设计一个数据结构. 给定一个正整数数列 \(a_0, a_1, \ldots , a_{n-1}\),你需要支持以下两种操作: MODIFY id x: 将 \ ...
- [18/12/3]蓝桥杯 练习系统 入门级别 Fibonacci数列求模问题 题解思路
前言略. 看到这个题目本来应该很高兴的,因为什么,因为太TM的基础了啊! 可是当你用常规方法尝试提交OJ时你会发现..hhh...运行超时..(开心地摇起了呆毛 //Fibonacci数列递归一般问题 ...
- P3986 斐波那契数列——数学(EXGCD)
https://www.luogu.org/problem/P3986 很久很久以前,我好像写过exgcd,但是我已经忘了: 洛谷上搜EXGCD搜不到,要搜(扩展欧几里得) 这道题就是ax+by=k, ...
- 题解【loj6277】数列分块入门1
题目描述 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字\(n\). 第二行输入\(n\)个数字,第\(i\)个数字为\(a_{i}\) ...
随机推荐
- C语言:最大公约数和最小公倍数
#include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...
- C语言:宏定义 本质及体现
- MySQL服务不见 - 解决方法
因为开发需要,今天安装了PHPStudy服务.导致以前的MySQL服务在服务表里面不见了.通过查阅网址的资料解决了,那么赶快记录下来 1. 确认当前的系统是管理员身份 2. 切换到MySQL数据库的安 ...
- File类与常用IO流第六章——使用try...catch...finally处理流中的异常
在JDK1.7之前: 1 package com.itheima.demo06.trycatch; 2 3 import java.io.FileWriter; 4 import java.io.IO ...
- MySQL用B+树(而不是B树)做索引的原因
众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...
- html自定义加载动画
整体代码 HTML 实现自定义加载动画,话不多说如下代码所示: <!DOCTYPE html> <html lang="en"> <head> ...
- 以初学者的角度理解:SQL实现关系除法
以初学者的角度理解:SQL实现关系除法 相信各位在学习SQL的时候,由于没有一家SQL语言提供除法命令而只能自己写一个.而网上大多就是四步骤加一个模板: select distinct A.X fro ...
- 【Azure Developer】【Python 】使用 azure.identity 和 azure.common.credentials 获取Azure AD的Access Token的两种方式
问题描述 使用Python代码,展示如何从Azure AD 中获取目标资源的 Access Token. 如要了解如何从AAD中获取 client id,client secret,tenant id ...
- Bootstrap框架--DataTables列表示例--添加判断
一.参考代码 <%@ include file="./include/header.jsp"%> <!-- jquery.dataTables.css --> ...
- SQlL 中 where 1=1
提升某种执行效率? 其实,1=1 是永恒成立的,意思无条件的,也就是说在SQL语句中有没有这个1=1都可以. 这个1=1常用于应用程序根据用户选择项的不同拼凑where条件时用的. 如:web界面查询 ...