Pagini recente » Cod sursa (job #2221116) | Cod sursa (job #1990799) | Cod sursa (job #43387) | Cod sursa (job #361759) | Cod sursa (job #109820)
Cod sursa(job #109820)
#include <cstdio>
FILE *ff=fopen("pairs.in","r");
FILE *g=fopen("pairs.out","w");
struct rec { long s,d; } b[30];
long k,m,f,x,i,j,q,l,n;
long a[100005],fr[1000000],sol[50];
long long sum1, sum;
void calc(long m)
{
long i,j,nr; long long p;
p=1; nr=0;
for (i=1; i<=m; i++) {
for (j=1; j<=sol[i]; j++) {p*=b[i].s; nr++;}
}
if (nr!=0) ++fr[p];
}
void back1(long k)
{
int i;
if (k==m+1) {
calc(m);
}
else
for (i=0; i<=b[k].d; i++) {
sol[k]=i;
back1(k+1);
}
}
void calc2(long m)
{
long i,nr,x; long long p;
p=1; nr=0;
for (i=1; i<=m; i++)
if (sol[i]==1) {p=p*b[i].s; nr++;}
if (nr%2==0) x=-1; else x=1;
sum1+=x*fr[p];
}
void back2(long k)
{
int i;
if (k==m+1) {
calc2(m);
}
else
for (i=0; i<=1; i++) {
sol[k]=i;
back2(k+1);
}
}
int main()
{
fscanf(ff,"%ld",&n);
for(i=1; i<=n; i++){
fscanf(ff,"%ld",&a[i]);
}
for (i=1; i<=n; i++) {
x=a[i]; m=1; b[m].d=0;
while(x%2==0 && x!=1) { x=x/2; b[m].s=2; b[m].d+=1; }
if (b[m].s==0) --m;
f=3;
while (x!=1) {
if (x%f==0) {
++m; b[m].s=f; b[m].d=1; x=x/f;
while (x%f==0 && x!=1) {
x=x/f; b[m].d+=1;
}
}
f+=2;
}
for (l=1;l<=m+1; l++) sol[l]=0;
back1(1);
}
sum=0;
for (i=1; i<=n; i++) {
x=a[i]; m=1; b[m].d=0;
while(x%2==0 && x!=1) { x=x/2; b[m].s=2; b[m].d+=1; }
if (b[m].d==0) --m;
f=3;
while (x!=1) {
if (x%f==0) {
++m; b[m].s=f; b[m].d=1; x=x/f;
while (x%f==0 && x!=1) {
x=x/f; b[m].d+=1;
}
}
f+=2;
}
sum+=n; sum1=0;
back2(1);
sum=sum-sum1;
}
fprintf(g,"%lld",sum/2);
fclose(g); fclose(ff);
}