結果
問題 | No.1261 数字集め |
ユーザー |
![]() |
提出日時 | 2020-09-30 22:37:48 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,091 bytes |
コンパイル時間 | 1,125 ms |
コンパイル使用メモリ | 77,024 KB |
実行使用メモリ | 11,392 KB |
最終ジャッジ日時 | 2024-07-21 03:42:16 |
合計ジャッジ時間 | 27,062 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 43 WA * 51 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <utility>#define MOD 1000000007using namespace std;long long modpow(long long a, long long n) {long long res = 1;while (n > 0) {if (n & 1) res = res * a % MOD;a = a * a % MOD;n >>= 1;}return res;}long long modinv(long long a) {return modpow(a, MOD - 2);}vector<long long> enum_divisors(long long N) {vector<long long> res;for (long long i = 1; i * i <= N; ++i) {if (N % i == 0) {res.push_back(i);// 重複しないならば i の相方である N/i も pushif (N/i != i) res.push_back(N/i);}}// 小さい順に並び替えるsort(res.begin(), res.end());return res;}long long p_q_r(long long p, long long q, long long r, long long M){if (r > p) swap(p, r);if (q > p) swap(p, q);if (r > q) swap(q, r);long long a, b, c, d, e;a = modpow(p, M - 2);b = modpow(q, M - 2);c = modpow(r, M - 2);d = (((a - c) * modinv(p - r) % MOD) + MOD) % MOD;e = (((b - c) * modinv(q - r) % MOD) + MOD) % MOD;d = d * p % MOD;e = e * q % MOD;return (((d - e) * modinv(p - q) % MOD) + MOD) % MOD;}int main() {long long N, M;cin >> N >> M;long long A[N];long long ans=0;for (int i = 1; i < N; i++) cin >> A[i];const auto &res = enum_divisors(N);long long count = 0;for (int i = 0; i < res.size(); i++){for (int j = 0; j < res.size(); j++){if (res[i] == 1 || res[j] == 1) continue;if (N == (res[i] * res[j])) continue;if (N % (res[i] * res[j]) == 0){long long p = A[res[i] - 1] - 1;long long q = A[res[i] * res[j] - 1] - 1;long long r = A[N - 1] - 1;ans += p_q_r(p, q, r, M);ans %= MOD;// cout << ans << endl;}}}cout<<ans<<endl;// for (int i = 0; i < res.size(); ++i) cout << res[i] << " ";// cout << endl;}