Cod sursa(job #1728497)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 13 iulie 2016 00:35:55
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>
#include <cstring>
#include <cctype>
#define MAXN 100000
#define MAXA 64
int A[MAXN+1],B[MAXN+1],C[MAXN+1];
char ciur[2*MAXA+1],m[2*MAXA+1];
int vf[MAXA+1][MAXA+1][MAXA+1],r[2*MAXA+1];
#define MAXBUF (1<<20)
char buf[MAXBUF];
int pos=MAXBUF;
FILE*fi,*fout;
inline char nextch(){
    if(pos==MAXBUF){
        fread(buf,1,MAXBUF,fi);
        pos=0;
    }
    return buf[pos++];
}
inline int getnr(){
    char a=nextch();
    while(isdigit(a)==0)
      a=nextch();
    int nr=0;
    while(isdigit(a)==1){
        nr=nr*10+a-'0';
        a=nextch();
    }
    return nr;
}
int n;
inline long long calc(int mod){
   int i,a,b,c;
   long long rez=0;
   memset(vf,0,sizeof(vf));
   for(i=0;i<=2*MAXA;i++)
     r[i]=i%mod;
   for(i=0;i<n;i++){
     a=r[mod-r[A[i]]];
     b=r[mod-r[B[i]]];
     c=r[mod-r[C[i]]];
     if(a<=MAXA&&b<=MAXA&&c<=MAXA)
       rez+=vf[a][b][c];
     vf[r[A[i]]][r[B[i]]][r[C[i]]]++;
   }
   return rez;
}
int main(){
    int i,j;
    long long sol;
    fi=fopen("puteri.in" ,"r");
    fout=fopen("puteri.out" ,"w");
    n=getnr();
    for(i=0;i<n;i++){
       A[i]=getnr();
       B[i]=getnr();
       C[i]=getnr();
    }
    for(i=2;i*i<=2*MAXA;i++)
     if(ciur[i]==0)
      for(j=i*i;j<=2*MAXA;j+=i)
        ciur[j]=1;
    for(i=2;i<=2*MAXA;i++)
      m[i]=1;
    for(i=2;i<=2*MAXA;i++)
     if(ciur[i]==0){
        for(j=i;j<=2*MAXA;j+=i)
          m[j]*=-1;
        for(j=i*i;j<=2*MAXA;j+=i*i)
          m[j]=0;
     }
    sol=0;
    for(i=2;i<=2*MAXA;i++)
     if(m[i]!=0)
       sol=sol-calc(i)*m[i];
    fprintf(fout,"%lld" ,sol);
    fclose(fi);
    fclose(fout);
    return 0;
}