Codeforces 396(#232 Div1) A. On Number of Decompositions into Multipliers
問題
n個の数aiが与えられる。
m = a1 * a2 * ... * anとする。
mをn個の数の積b1 * b2 * ... * bnとしてあらわす方法は何通りあるかmod 10^9 + 7で答えよ。
制約条件
n≦500
ai≦10^9
方針
素因数ごとに独立して、n個に割り振る場合の数を求めて掛けるだけ。
なんでこんなのが解けなかったのかorz
ブランクで典型問が解けない病になっている。酷い。UTPCオンサイト大丈夫だろうか。
ソースコード
const int mod = (int)1e9 + 7; int n, dp[501][20000]; map<int, int> e; int main(){ cin >> n; dp[0][0] = 1; rep(i, n) rep(j, 20000){ dp[i + 1][j] = (j ? dp[i + 1][j - 1] : 0) + dp[i][j]; dp[i + 1][j] %= mod; } rep(i, n){ int a; cin >> a; for(int j = 2; (ll)j * j <= a; j++) if(a % j == 0){ int c = 0; for(; a % j == 0; a /= j) c++; e[j] += c; } if(a > 1) e[a]++; } ll ans = 1; each(i, e) ans = ans * dp[n][i->second] % mod; cout << ans << endl; return 0; }