Java教程

暑假集训3

本文主要是介绍暑假集训3,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

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

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;
}

这篇关于暑假集训3的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!