結果
問題 | No.125 悪の花弁 |
ユーザー | evima |
提出日時 | 2015-01-12 00:17:14 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,062 bytes |
コンパイル時間 | 1,464 ms |
コンパイル使用メモリ | 163,240 KB |
実行使用メモリ | 34,688 KB |
最終ジャッジ日時 | 2024-06-22 04:10:49 |
合計ジャッジ時間 | 2,384 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 47 ms
27,168 KB |
testcase_02 | AC | 65 ms
30,588 KB |
testcase_03 | AC | 64 ms
34,688 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
ソースコード
// Enjoy your stay. #include <bits/stdc++.h> #define EPS 1e-9 #define INF 1070000000LL #define MOD 1000000007LL #define fir first #define foreach(it,X) for(auto it=(X).begin();it!=(X).end();it++) #define ite iterator #define mp make_pair #define mt make_tuple #define rep(i,n) rep2(i,0,n) #define rep2(i,m,n) for(int i=m;i<(n);i++) #define pb push_back #define sec second #define sz(x) ((int)(x).size()) using namespace std; typedef istringstream iss; typedef long long ll; typedef pair<ll,ll> pi; typedef stringstream sst; typedef vector<ll> vi; int K; int C[100010]; ll extgcd(ll a,ll b,ll& x, ll& y){ ll d=a; if(b)d=extgcd(b,a%b,y,x),y-=(a/b)*x; else x=1,y=0; return d; } ll mod_inverse(ll a,ll m){ ll x,y; extgcd(a,m,x,y); return ((ll)m+x%m)%m; } ll fact[1000010]; ll num[1000010]; ll inv[1000010]; ll getinv[1000010]; ll factinv[1000010]; vi primes; vi divs; void getInv(int n){ inv[1]=1; rep2(i,2,n+1)inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD; } ll numPrime(ll n){ ll res = 0; rep(i,sz(primes)){ while(n % primes[i] == 0){ n /= primes[i]; res++; } } return res; } int main(){ cin.tie(0); ios_base::sync_with_stdio(0); cin>>K; rep(i,K)cin>>C[i]; int S = 0; rep(i,K)S += C[i]; ll S_ = S; rep2(i,2,S+1){ if(S_ % i == 0){ primes.pb(i); while(S_ % i == 0){ S_ /= i; } } } rep2(i,1,S+1){ if(S % i == 0){ divs.pb(i); } } getInv(S); factinv[0] = 1; rep(i,S) factinv[i+1] = factinv[i] * inv[i+1] % MOD; fact[0] = 1; rep(i,S) fact[i+1] = fact[i] * (i+1) % MOD; ll ans = 0; rep2(i,1,S+1)if(S % i == 0){ //cerr<<i<<endl; ll res = fact[i]; int ok = 1; int dv = S / i; rep(j,K)if(C[j] % dv != 0){ ok = 0; break; }else{ res = res * factinv[C[j] / dv] % MOD; } if(ok == 0)continue; num[i] = res; //cerr<<i<<":"<<num[i]<<endl; rep(j,sz(divs)){ if(divs[j] == i) break; if(i % divs[j] == 0){ int D = i / divs[j]; if(numPrime(D) == 1) res += MOD - num[divs[j]]; else res += num[divs[j]]; } } ans += res * inv[i] % MOD; } cout<<ans % MOD<<endl; }