結果
| 問題 | No.125 悪の花弁 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2015-06-23 17:25:34 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 78 ms / 5,000 ms | 
| コード長 | 2,662 bytes | 
| コンパイル時間 | 597 ms | 
| コンパイル使用メモリ | 71,888 KB | 
| 実行使用メモリ | 11,568 KB | 
| 最終ジャッジ日時 | 2024-07-07 17:11:38 | 
| 合計ジャッジ時間 | 1,127 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 6 | 
ソースコード
#include <algorithm>
#include <vector>
#include <cmath>
#include <assert.h>
/*
 * Operations of power.
 * Header requirement: algorithm, vector, cmath
 */
class Power {
  typedef long long i64;
public:
  /* a^b with no modulo operations */
  static long long power(long long a, long long b) {
    i64 s = 1;
    i64 c = a;
    while (b > 0) {
      if (b % 2) {
	s *= c;
      }
      c *= c;
      b /= 2;
    }
    return s;
  }
  /* return (a,b) s.t, n = a^b and b is maximal. O(64) */
  static std::pair<long long, int> toPower(long long n) {
    for (int i = 64; i >= 2; i--) {
      i64 app = std::pow(n, 1.0/i);
      for (int d = -4; d <= 4; d++) {
	i64 x = app + d;
	if (x <= 0) continue;
	if (power(x, i) == n) {
	  return std::pair<i64, int>(x, i);
	}
      }
    }
    return std::pair<i64, int>(n, 1);
  }
  /* factorize n and returns prime factors and their exponents.  O(sqrt(n)) */
  static std::vector<std::pair<long long, int> > factorize(long long n) {
    std::vector<std::pair<i64, int> > res;
    i64 p = 2;
    int c = 0;
    while (n >= 1) {
      if (c == 0 && n < p * p) {
	if(n != 1) {
	  res.push_back(std::pair<i64, int>(n,1));
	}
	break;
      }
      if (n % p != 0) {
	if (c > 0) {
	  res.push_back(std::pair<i64, int>(p,c));
	}
	p++;
	c = 0;
	continue;
      }
      n /= p;
      c++;
    }
    return res;
  }
  /*
   * Euler's totient function. O(sqrt(n))
   */
  static long long totient(long long n) {
    std::vector<std::pair<i64, int> > res = factorize(n);
    for (int i = 0; i < res.size(); ++i) {
      i64 p = res[i].first;
      n /= p;
      n *= p - 1;
    }
    return n;
  }
};
#include <iostream>
#define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++)
using namespace std;
typedef long long int ll;
typedef vector<int> VI;
typedef pair<int, int> PI;
const double EPS=1e-9;
const ll mod = 1e9 + 7;
ll invmod(ll x) {
  ll e = mod - 2;
  ll sum = 1;
  ll cur = x;
  while (e > 0) {
    if (e % 2) {
      sum = sum * cur % mod;
    }
    cur = cur * cur % mod;
    e /= 2;
  }
  return sum;
}
const int F = 1e6 + 10;
ll ftbl[F];
const int K = 100100;
int c[K];
int main(void){
  ll tmp = 1;
  REP(i, 0, F) {
    ftbl[i] = tmp;
    tmp *= i + 1;
    tmp %= mod;
  }
  int k;
  cin >> k;
  int g = 0;
  int tot = 0;
  REP(i, 0, k) {
    cin >> c[i];
    g = __gcd(g, c[i]);
    tot += c[i];
  }
  ll cnt = 0;
  REP(f, 1, g + 1) {
    if (g % f != 0) {
      continue;
    }
    ll sum = ftbl[tot / f];
    REP(i, 0, k) {
      sum *= invmod(ftbl[c[i] / f]);
      sum %= mod;
    }
    sum *= Power::totient(f);
    cnt += sum;
    cnt %= mod;
  }
  cnt *= invmod(tot);
  cnt %= mod;
  cout << cnt << endl;
}
            
            
            
        