Pagini recente » Cod sursa (job #2638754) | Cod sursa (job #2404499) | Cod sursa (job #2565836) | Cod sursa (job #3280058) | Cod sursa (job #109591)
Cod sursa(job #109591)
using namespace std;
#include <cstdio>
#include <vector>
#include <fstream>
#include <set>
#include <bitset>
#define pb push_back
//bitset<1000001>primes;
bool primes[1000001];
//bitset<1000001>used;
bool used[1000001];
int n=1000000;
int a[100001];
vector<int>A[1000001];
int N;
//set<int> poz[1000001];
vector<int>poz2[1000001];
void ciur()
{
int i, j;
for(i=2;i<=n;++i)
if(!primes[i])
for(j=i; j<=n;j+=i)
{
// printf("%d %d\n", i, j);
if(used[j]) A[i].pb(j), poz2[j].pb(i);
primes[j]=1;
//if(used[j]) poz2[j].pb(i);//poz[j].insert(i);
}
/*
for(i=2;i<=10;++i)
{
for(vector<int>::iterator it=A[i].begin();it!=A[i].end();++it)printf("%d ", *it);
printf("\n");
}
*/
}
void read()
{
ifstream f("pairs.in");
f>>N;
for(int i=1;i<=N;++i) f>>a[i];
for(int i=1;i<=N;++i) used[a[i]]=1;
f.close();
}
//int use[1000001];
bitset<1000001>use;
void solve()
{
int i, j, p,t, aa;
long long nr=0;
vector<int>::iterator it;
vector<int>::iterator jt;
for(i=1;i<=N;++i)
{
aa=a[i];
set<int>Sol;
// vector<int>Q;
t=0;
for(it=poz2[aa].begin();it!=poz2[aa].end();++it)
{
p=*it;
for(jt=A[p].begin();jt!=A[p].end();++jt)
if(use[*jt]==1);
else ++t,use[*jt]=1;// Q.pb(*jt);// Sol.insert(*jt);
}
//printf("%d\n", poz[a[i]].size());
for(it=poz2[aa].begin();it!=poz2[aa].end();++it)
{
p=*it;
for(jt=A[p].begin();jt!=A[p].end();++jt)
use[*jt]=0;// Q.pb(*jt);// Sol.insert(*jt);
}
//t=Sol.size();
t=N-t;
//printf("%d\n", t);
// printf("%d : %d %d\n", a[i],N, t);
nr+=(long long)t;
}
freopen("pairs.out","w",stdout);
printf("%lld\n", nr/2);
}
int main()
{
read();
ciur();
solve();
return 0;
}