結果
| 問題 |
No.644 G L C C D M
|
| コンテスト | |
| ユーザー |
sekiya9311
|
| 提出日時 | 2018-02-03 14:33:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 2,000 ms |
| コード長 | 1,129 bytes |
| コンパイル時間 | 1,533 ms |
| コンパイル使用メモリ | 169,508 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-11 15:20:48 |
| 合計ジャッジ時間 | 2,248 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
std::vector<int> euler_phi(int N) {
N++; std::vector<int> ret(N);
std::iota(std::begin(ret), std::end(ret), 0);
for (int i = 2; i < N; i++) {
if (ret[i] == i) {
for (int j = i; j < N; j += i) {
ret[j] /= i;
ret[j] *= (i - 1);
}
}
}
return ret;
}
using namespace std;
const int MOD = 1e9 + 7;
int N, M;
vector<int> phi;
void naive(int n, int m) {
long long ans = 0;
long long fact = 1;
for (int i = 2; i <= N - 2; i++) {
(fact *= i) %= MOD;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (__gcd(i + 1, j + 1) == m) {
(ans += fact) %= MOD;
}
}
}
cout << ans * 2 % MOD << endl;
}
int main() {
cin >> N >> M;
//naive(N, M);
phi = euler_phi(N);
long long fact = 1;
for (int i = 2; i <= N - 2; i++) {
(fact *= i) %= MOD;
}
long long ans = 0;
for (int i = 2; i <= N / M; i++) {
(ans += fact * phi[i]) %= MOD;
}
cout << ans * 2 % MOD << endl;
}
sekiya9311