2020.07.31模擬11
阿新 • • 發佈:2020-07-31
關於考試總結
見總結
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; }