結果
| 問題 | No.3332 Consecutive Power Sum (Small) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-29 01:20:53 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 15 ms / 2,025 ms |
| + 937µs | |
| コード長 | 1,624 bytes |
| 記録 | |
| コンパイル時間 | 2,071 ms |
| コンパイル使用メモリ | 186,280 KB |
| 実行使用メモリ | 13,432 KB |
| 最終ジャッジ日時 | 2026-10-29 01:21:04 |
| 合計ジャッジ時間 | 5,309 ms |
|
ジャッジサーバーID (参考情報) |
judge7_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 52 |
ソースコード
#include <algorithm>
#include <iostream>
#include <tuple>
#include <vector>
std::vector<long long> divisors(long long n) {
std::vector<long long> res;
for (long long i = 1; i <= n / i; i++) {
if (n % i > 0) { continue; }
res.push_back(i);
}
std::reverse(res.begin(), res.end());
return res;
}
void solve() {
using namespace std;
long long n;
cin >> n;
auto pow = [&](long long x, int k, long long lim) -> long long {
long long res = 1;
for (int _ = 0; _ < k; _++) {
if (res > lim / x) { return -1; }
res *= x;
}
return res;
};
vector<tuple<int, long long, long long>> ans;
// e = 1
for (auto d : divisors(n * 2)) {
long long e = n * 2 / d;
if ((e - d) % 2 == 0) { continue; }
long long l = (e - d - 1) / 2;
long long r = l + d;
ans.emplace_back(1, l + 1, r);
}
// e > 1
for (int e = 2; e < 40; e++) {
vector<long long> acc = {0};
for (long long i = 1; ; i++) {
long long p = pow(i, e, n);
if (p == -1) { break; }
acc.push_back(acc.back() + p);
}
int sz = acc.size(), r = 0;
for (int l = 0; l < sz; l++) {
while (r < sz && acc[l] + n > acc[r]) { r++; }
if (r < sz && acc[l] + n == acc[r]) { ans.emplace_back(e, l + 1, r); }
}
}
cout << ans.size() << "\n";
for (auto [e, l, r] : ans) { cout << e << " " << l << " " << r << "\n"; }
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
solve();
}