結果
| 問題 |
No.473 和と積の和
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-05-10 23:53:56 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 50 ms / 3,000 ms |
| コード長 | 1,498 bytes |
| コンパイル時間 | 1,702 ms |
| コンパイル使用メモリ | 172,556 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 01:05:21 |
| 合計ジャッジ時間 | 3,224 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 43 |
ソースコード
// TLE版を修正.
// 自力解答不可(※計算量削減が分からない)のため, 正解者様のソースを参照.
// https://yukicoder.me/submissions/139856
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
double EPS = 0.0000000000001;
vector<LL> D;
// nをD[m]以上のk個の約数で分解する方法
LL dec(LL n, LL m, int k){
if(k == 0){
if(n == 1) return 1;
else return 0;
}
if(k == 1){
if(n >= D[m]) return 1;
else return 0;
}
if(pow(n, 1.0 / k) + EPS < D[m]) return 0;
LL ret = 0;
for(int d = m; d < D.size(); d++){
if(n < D[d] * D[d]) break;
if(n % D[d] == 0){
LL nn = n;
int cnt = 1;
while(nn % D[d] == 0 && k >= cnt){
nn /= D[d];
ret += dec(nn, d + 1, k - cnt);
cnt++;
}
}
}
return ret;
}
vector<LL> div(LL n){
vector<LL> ret;
for(LL d = 2; d * d <= n; d++) {
if(n % d == 0) {
ret.push_back(d);
if(d * d != n) ret.push_back(n / d);
}
}
ret.push_back(n);
sort(ret.begin(), ret.end());
return ret;
}
int main() {
// 1. 入力情報取得.
LL N, X;
// cin >> N >> X;
scanf("%llu %llu", &N, &X);
// 2. X + 1 を 素因数分解.
D = div(X + 1);
// 3. 出力 ~ 後処理.
LL ans = dec(X + 1, 0, N);
printf("%llu\n", ans);
return 0;
}
@abcde