🐥
ARC 004 | C - 平均値太郎の憂鬱 ( The melancholy of Taro Heikinchi )
問題
考えたこと
1からNまでの正整数を足すと以下の式となる。
ここから
変形すると以下となる。
式(1)と
式(1)を変形させると以下となる。
上記と
よって(3)は以下に変形できる。
よって、式(2)(4)の条件より
これにより
コード
実装時に気をつけること
-
が非常に大きい(X )のでX \leq 10^{18} とX は約分するY -
がN で割り切れるか確認するY
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
const int MOD = 1e9 + 7;
ll gcd(ll a, ll b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
string s;
cin >> s;
ll x = 0;
ll y = 0;
{
int pos = s.find('/');
for (int i = 0; i < pos; i++) {
x = x * 10 + (s[i] - '0');
}
for (int i = pos + 1; i < s.size(); i++) {
y = y * 10 + (s[i] - '0');
}
}
// 約分する
ll g = gcd(x, y);
x /= g;
y /= g;
bool found = false;
ll minN = 2 * x / y - 1;
ll maxN = 2 * x / y + 1;
for (ll n = minN; n <= maxN; n++) {
if (n % y != 0) {
continue;
}
ll m = n * (n + 1) / 2 - n / y * x;
if (0 < m && m <= n) {
cout << n << " " << m << endl;
found = true;
}
}
if (!found) {
cout << "Impossible" << endl;
}
}
Discussion