結果
| 問題 |
No.2847 Birthday Attack
|
| コンテスト | |
| ユーザー |
AngrySadEight
|
| 提出日時 | 2024-07-05 01:32:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 607 ms / 3,000 ms |
| コード長 | 1,879 bytes |
| コンパイル時間 | 737 ms |
| コンパイル使用メモリ | 78,320 KB |
| 最終ジャッジ日時 | 2025-02-22 02:09:02 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 14 |
ソースコード
#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
ll my_gcd(ll a, ll b) {
ll ret = 0;
if (a < b) {
swap(a, b);
}
if (b == 0) {
ret = a;
} else {
ret = my_gcd(b, a % b);
}
return ret;
}
int main() {
ll X, Y, M;
cin >> X >> Y >> M;
ll ans = 0;
for (ll i = 1; i <= X; i++) {
ans += 2 * max(X - 2 * i, 0LL) * Y;
ans %= M;
}
for (ll i = 1; i <= Y; i++) {
ans += 2 * max(Y - 2 * i, 0LL) * X;
ans %= M;
}
// ピタゴラス数を列挙する
vector<pair<ll, pll>> p(0);
for (ll m = 1; m * m <= 4000000; m++) {
for (ll n = m + 1; n * n <= 4000000; n++) {
if (m * m + n * n > 8000000) {
continue;
}
if (m % 2 == n % 2) {
continue;
}
ll g = my_gcd(n, m);
if (g != 1) {
continue;
}
ll min_p = 2 * m * n;
ll max_p = n * n - m * m;
pll pp1 = pll(min_p, max_p);
pll pp2 = pll(max_p, min_p);
pair<ll, pll> ppp1 = pair<ll, pll>(m * m + n * n, pp1);
pair<ll, pll> ppp2 = pair<ll, pll>(m * m + n * n, pp2);
p.push_back(ppp1);
p.push_back(ppp2);
}
}
// 列挙されたピタゴラス数の全てに対して、斜めのぶんの数え上げを行う
ll len_p = p.size();
for (ll i = 0; i < len_p; i++) {
ll x1 = p[i].second.first;
ll y1 = p[i].second.second;
for (ll j = 1; j <= min(X / y1, Y / x1); j++) {
ll x = x1 * j;
ll y = y1 * j;
ans += 4 * max(Y - 2 * x, 0LL) * max(X - 2 * y, 0LL);
ans %= M;
}
}
cout << ans << endl;
}
AngrySadEight