結果
問題 | No.125 悪の花弁 |
ユーザー |
![]() |
提出日時 | 2015-04-06 03:24:25 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 66 ms / 5,000 ms |
コード長 | 1,304 bytes |
コンパイル時間 | 1,290 ms |
コンパイル使用メモリ | 163,992 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-04 03:17:32 |
合計ジャッジ時間 | 2,109 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 6 |
ソースコード
#include "bits/stdc++.h"using namespace std;long long mod = (long long)1e9 + 7;int gcd(int a, int b){if (b == 0) return a;return gcd(b, a%b);}long long powmod(long long a, int p){if (p == 0) return 1;if (p % 2 == 1){return (powmod(a, p - 1) * a) % mod;}long long mid = powmod(a, p / 2);return (mid * mid) % mod;}long rev(long long a){return powmod(a, mod - 2);}int main() {int K;cin >> K;vector<int> C(K);int sum = 0;for (int i = 0; i < K; i++){cin >> C[i];sum += C[i];}int g = C[0];for (int i = 0; i < K; i++){g = gcd(g, C[i]);}long long ans = 0;vector<int> factor;vector<long long> num;for (int i = g; i >= 1; i--){if (g%i != 0) continue;int remain = sum / i - 1;long long mul = 1;long long div = 1;for (int j = 0; j < K; j++){int end = 0;if (j == 0) end = 1;for (int l = 0; l < C[j] / i - end; l++){mul *= remain--;mul %= mod;div *= l + 1;div %= mod;}}mul *= rev(div);for (int j = 0; j < factor.size(); j++){if (factor[j] % i != 0) continue;mul -= num[j];}mul %= mod;mul += mod;mul %= mod;num.push_back(mul);mul *= rev(C[0] / i);mul %= mod;factor.push_back(i);ans += mul;ans %= mod;}cout << ans << endl;}