Pagini recente » Cod sursa (job #1318077) | Cod sursa (job #3335924) | Cod sursa (job #3342874) | Cod sursa (job #3342930) | Cod sursa (job #3306569)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin ("indep.in");
ofstream fout ("indep.out");
bool IsPrime [1002];
vector <int> primes;
vector <int> add,sbt;
int pr[1002];
int v[505];
int nrdiv[1002];
void Ciur(){
IsPrime[0] = 0;
IsPrime[1] = 0;
pr[1] = 1;
for (int i=2;i<=1000;++i){
IsPrime[i] = 1;
pr[i] = 1;
}
for (int i=2;i<=1000;++i){
if (IsPrime[i]==1){
pr[i] *= i;
for (int j=2*i;j<=1000;j+=i){
IsPrime[j] = 0;
pr[j] *= i;
}
}
}
for (int i=2;i<=1000;++i){
if (IsPrime[i]==1) primes.push_back(i);
}
}
void Inmultire(vector <int> &a,int b){
int r = 0;
for (int i=0;i<a.size();++i){
a[i] = a[i]*b+r;
r = a[i]/10;
a[i] = a[i]%10;
}
while (r){
a.push_back(r%10);
r /= 10;
}
return;
}
void Adunare(vector <int> &a,vector <int> b){
while (b.size()>a.size()){
a.push_back(0);
}
while (b.size()<a.size()){
b.push_back(0);
}
int r = 0;
for (int i=0;i<a.size();++i){
a[i] = a[i]+b[i]+r;
r = a[i]/10;
a[i] = a[i]%10;
}
if (r){
a.push_back(r);
}
return;
}
void Scadere(vector <int> &a,vector <int> b){
while(b.size()<a.size()) b.push_back(0);
int r = 0;
for (int i=0;i<a.size();++i){
a[i] -= b[i];
a[i] -= r;
if (a[i]<0){
a[i] += 10;
r = 1;
}else{
r = 0;
}
}
while (a.size()>1 and !a.back()) a.pop_back();
return;
}
signed main()
{
Ciur();
int n,Max = 0;
fin >> n;
for (int i=1;i<=n;++i){
fin >> v[i];
Max = max(Max,v[i]);
for (int j=1;j<=v[i];++j){
if (v[i]%j==0){
nrdiv[j]++;
}
}
}
vector <int> ans;
ans.push_back(0);
for (int i=1;i<=Max;++i){
if (i!=pr[i]) continue;
int nr = 0;
int I = i;
for (auto x:primes){
if (I%x==0){
nr++;
}
while(I%x==0){
I /= x;
}
}
if (I>1) nr++;
int semn = 1;
if (nr%2==1) semn = -1;
if (nrdiv[i]==0) continue;
cout << i << ' ' << semn << ' ' << nrdiv[i] << '\n';
if (semn==1) add.push_back(nrdiv[i]);
else if (semn==-1) sbt.push_back(nrdiv[i]);
}
//cout << '\n';
for (auto x:add){
vector <int> pw;
pw.push_back(1);
for (int j=1;j<=x;++j){
Inmultire(pw,2);
}
vector <int> vid;
vid.push_back(1);
Scadere(pw,vid);
Adunare(ans,pw);
}
for (auto x:sbt){
vector <int> pw;
pw.push_back(1);
for (int j=1;j<=x;++j){
Inmultire(pw,2);
}
vector <int> vid;
vid.push_back(1);
Scadere(pw,vid);
Scadere(ans,pw);
}
for (int i=ans.size()-1;i>=0;--i) fout << ans[i];
return 0;
}