Основное
 
 
Отправитель Задача Язык Вердикт Время Память Отослано Протест.  
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;
}
?
Время: ? ms, память: ? КБ
Вердикт: ?
Ввод
?
Вывод участника
?
Ответ жюри
?
Комментарий чекера
?
Диагностика
?
Показать детали тестирования