?
№ | Отправитель | Задача | Язык | Вердикт | Время | Память | Отослано | Протест. | |
---|---|---|---|---|---|---|---|---|---|
16858387 |
Дорешивание: SaidbekTATUFF |
653G - 16 | GNU C++ | Полное решение | 420 мс | 20240 КБ | 2016-03-21 17:49:10 | 2016-03-21 17:49:10 |
#include <bits/stdc++.h> using namespace std; #define ll long long #define N 300005 #define mod 1000000007 #define inv2 500000004 int n,a[N]; vector<int> val[N]; ll ans,p[N],inv[N],mul[N]; ll qpow(ll x,ll k) { ll ret=1; while(k) { if(k&1) ret=ret*x%mod; k>>=1;x=x*x%mod; } return ret; } ll C(int n,int m) { return p[n]*inv[m]%mod*inv[n-m]%mod; } int main() { #ifndef ONLINE_JUDGE freopen("tt.in","r",stdin); #endif cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); int tmp=a[i]; for(int j=2;j*j<=tmp;j++) if(tmp%j==0) { int cnt=0; while(tmp%j==0) cnt++,tmp/=j; val[j].push_back(cnt); } if(tmp>1) val[tmp].push_back(1); } p[0]=inv[0]=1; for(int i=1;i<=n;i++) { p[i]=p[i-1]*i%mod; inv[i]=qpow(p[i],mod-2); } mul[0]=qpow(2,n-1)-1; for(int i=0;i<n-1;i++) mul[i+1]=(mul[i]-C(n-1,i)-C(n-1,i+1))%mod; for(int i=1;i<=300000;i++) if(val[i].size()>0) { sort(val[i].begin(),val[i].end()); for(int j=0;j<val[i].size();j++) ans=(ans+val[i][val[i].size()-1-j]*mul[j])%mod; } cout<<(ans+mod)%mod<<endl; }
?
?
?
?