結果
問題 | No.1261 数字集め |
ユーザー |
![]() |
提出日時 | 2020-10-12 22:34:43 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,134 ms / 8,000 ms |
コード長 | 3,425 bytes |
コンパイル時間 | 970 ms |
コンパイル使用メモリ | 78,664 KB |
実行使用メモリ | 35,840 KB |
最終ジャッジ日時 | 2024-07-21 03:40:58 |
合計ジャッジ時間 | 33,081 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 94 |
ソースコード
#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];for (int i = 1; i < N; i++) cin >> A[i];const auto &res = enum_divisors(N);long long count = 0;long long ans = 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 = (ans + p_q_r(p, q, r, M)) % MOD;}}}cout << ans << endl;long long Q; cin >> Q;vector<long long> num[N];bool flag[N]; for (int i = 0; i < N; i++) flag[i] = false;for (int i = 0; i < Q; i++){long long X, Y; cin >> X >> Y;if (Y == N){const auto &res_ = enum_divisors(X);for (int i = 0; i < res_.size(); i++){if (res_[i] == 1 || res_[i] == X) continue;long long p = A[res_[i] - 1] - 1;long long q = A[X - 1] - 1;long long r = A[Y - 1] - 1;ans = (ans + p_q_r(p, q, r, M)) % MOD;}for (int i = 0; i < num[X - 1].size(); i++){long long p = A[num[X - 1][i] - 1] - 1;long long q = A[X - 1] - 1;long long r = A[Y - 1] - 1;ans = (ans + p_q_r(p, q, r, M)) % MOD;}flag[X - 1] = true;}if (Y != N){if (N % Y == 0){long long p = A[X - 1] - 1;long long q = A[Y - 1] - 1;long long r = A[N - 1] - 1;ans = (ans + p_q_r(p, q, r, M)) % MOD;}if (flag[Y - 1] == true){long long p = A[X - 1] - 1;long long q = A[Y - 1] - 1;long long r = A[N - 1] - 1;ans = (ans + p_q_r(p, q, r, M)) % MOD;}num[Y - 1].push_back(X);}cout << ans << endl;}}