Pagini recente » Cod sursa (job #2982457) | Cod sursa (job #2495283) | Cod sursa (job #1829909) | Cod sursa (job #987441) | Cod sursa (job #2263245)
#include <iostream>
#include <fstream>
#include <bitset>
#define VMAX 1000010
#define MAX 100010
#define PMAX 10
#define x first
#define y second
using namespace std;
typedef long long ll;
int n,a,sz;
int pd[VMAX],nrm[VMAX],d[VMAX];
pair<int,int> dp[PMAX];
bitset<VMAX> prim;
void ciur(){
prim.set();
prim[0]=prim[1]=0;
for(int i=2;i<VMAX;i++)
if(prim[i]){
pd[i]=i;
for(ll j=(ll)i*i;j<VMAX;j+=i)
if(prim[j])
prim[j]=0,
pd[j]=i;
}
}
void bkt(int nra,int nr,int ce){
if(nra==sz){
if(ce==0)nrm[nr]++;
else if(ce!=nr)d[nr]-=d[ce];
return;
}
for(int i=0,p=1;i<=dp[nra+1].y;i++,p*=dp[nra+1].x)
bkt(nra+1,nr*p,ce);
}
void marcheazadiv(int nr,int ce){
sz=0;
while(nr!=1){
int da=pd[nr],exp=0;
while(nr%da==0)nr/=da,exp++;
dp[++sz]=make_pair(da,exp);
}
bkt(0,1,ce);
}
int main()
{
ifstream f ("pairs.in");
ofstream g ("pairs.out");
ciur();
f>>n;
for(int i=1;i<=n;i++) f>>a,marcheazadiv(a,0);
for(int i=VMAX-1;i>=1;i--){
d[i]+=nrm[i]*(nrm[i]-1)/2;
if(d[i]!=0)marcheazadiv(i,i);
}
g<<d[1];
f.close ();
g.close ();
return 0;
}