1. 程式人生 > 實用技巧 >2020.07.31模擬11

2020.07.31模擬11

關於考試總結
總結

A. 解方程

題目描述

解出一元二次方程ax+by=c的一組解(x0, y0),使|x0+y0|最小。

輸入格式

共一行,三個整數a,b,c。

輸出格式

共一行,為|x0+y0|的最小值。
若無解輸出“kito”。

樣例輸入

1 1 1

樣例輸出

1

資料範圍與提示

\(30\%\)的資料 \(a,b\)均為質數,\(c=1\)
另有\(20\%\)的資料 \(a,b,c\)均為質數
\(100\%\)的資料 \(a,b,c<=1,000,000,000\)

solution

這個題正解有點ex
yxy隨手推了一個式子

\[ax+by=c \]

\[|x+y|=i \]

分兩種情況

  • First

\[x=i-y \]

\[a(i-y)+by=c \]

\[a*i-ay+by=c \]

\[(b-a)y=c-a*i \]

\[y= \frac {c-a*i} {b-a} \]

  • Second

\[x=-i-y \]

\[y = \frac {c+a*i} {b-a} \]

在寫程式碼的時候,需要分別討論兩種情況
然後暴力直接跑\(1e9\)
複雜度、、、\(O(Input)\)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define int long long
using namespace std;

inline int read(){
	int x = 0, w = 1;
	char ch;
	for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return x * w; 
}

signed main(){
	int a = read(), b = read(), c = read();
	if(c == 0) return cout << "0\n", 0;
	if(a == b){
		if(c % a == 0)
			cout << c / a << endl;
		else cout << "kito\n";
		return 0;
	}
	for(int i = 0; i <= 1e9; i++){
		if((c - i * a) % (b - a) == 0){
			int y = (c - i * a) / (b - a);
			int x = i - y;
			if(a * x + b * y == c)
				return cout << i << "\n", 0;
		}
		if((c + i * a) % (b - a) == 0){
			int y = (c + a * i) / (b - a);
			int x = - i - y;
			if(a * x + b * y == c)
				return cout << i << "\n", 0;
		}
	}
	cout << "kito\n";
	return 0;
}