ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

暑假集训3

2022-08-15 21:34:32  阅读:201  来源: 互联网

标签:long return gcd int exgcd swap 暑假 集训


去年暑假打过一次,但是当时太菜,今天看到之前写过,好奇多少分,考后交了一发,发现自己是真的菜

然后,就算开了个坑吧,四道题。。。

A. 数列

\(exgcd\)板子

然后,\(exgcd\)咋用来着?

滚回去学数论基础了

code
#include <cstdio>
using namespace std;
#define int long long
int min(int x, int y) { return x < y ? x : y; }
int max(int x, int y){return x > y ? x : y;}
int abs(int x) { return x < 0 ? -x : x; }
void swap(int &x, int &y){x ^= y; y ^= x; x ^= y;}
int exgcd(int a, int b, int &x, int &y){
	if(b == 0){
		x = 1; y = 0;
		return a;
	}
	int gcd = exgcd(b, a % b, y, x);
	y = y - a / b * x;
	return gcd;
}
signed main(){
	int n, a, b;
	scanf("%lld%lld%lld", &n, &a, &b);
	int x, y; if(a > b)swap(a, b);
	int gcd = exgcd(a, b, x, y);
	b = b / gcd; a = a / gcd;
	x = (x % b + b) % b;
	int ans = 0;
	bool flag = 1;
	for (int i = 1; i <= n; ++i){
		int now; scanf("%lld",&now); now = abs(now);
		if(now % gcd)flag = 0;
		if(flag){
			now = now / gcd;
			int nx = (x * now % b + b) % b;
			int ny = (now - a * nx) / b;
			ans += min(abs(nx) + abs(ny), abs(nx - b) + abs(ny + a));
		}
	}
	if(flag)printf("%lld\n", ans);
	else printf("-1\n");
	return 0;
}

标签:long,return,gcd,int,exgcd,swap,暑假,集训
来源: https://www.cnblogs.com/Chencgy/p/16589663.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有