Cod sursa(job #1727258)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 10 iulie 2016 12:58:49
Problema Puteri Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#define MAXE 64
#define MAXC 128
#define MAXN 100000
bool prim[MAXC+1];
int s[MAXE][MAXE][MAXE];
int mobius[MAXC+1];
int n, a[MAXN], b[MAXN], c[MAXN];
int a1[MAXN], b1[MAXN], c1[MAXN];
inline long long solve(int mod){
    int i, a2, b2, c2;
    long long ans=0;
    for(i=0; i<n; i++){
        a1[i]=a[i]%mod;
        b1[i]=b[i]%mod;
        c1[i]=c[i]%mod;
        if(a1[i]==0) a2=0;
        else a2=mod-a1[i];
        if(b1[i]==0) b2=0;
        else b2=mod-b1[i];
        if(c1[i]==0) c2=0;
        else c2=mod-c1[i];
        if((a2<MAXE)&&(b2<MAXE)&&(c2<MAXE)) ans+=s[a2][b2][c2];
        s[a1[i]][b1[i]][c1[i]]++;
    }
    for(i=0; i<n; i++) s[a1[i]][b1[i]][c1[i]]=0;
    return ans;
}
int main(){
    int i, j;
    long long ans=0;
    FILE *fin, *fout;
    fin=fopen("puteri.in", "r");
    fout=fopen("puteri.out", "w");
    fscanf(fin, "%d", &n);
    for(i=0; i<n; i++) fscanf(fin, "%d%d%d", &a[i], &b[i], &c[i]);
    for(i=2; i<=MAXC; i++) mobius[i]=1;
    for(i=2; i<=MAXC; i++){
        if(prim[i]==0){
            for(j=2*i; j<=MAXC; j+=i) mobius[j]*=-1, prim[j]=1;
            for(j=i*i; j<=MAXC; j+=i*i) mobius[j]=0;
        }
        if(mobius[i]!=0) ans+=mobius[i]*solve(i);
    }
    fprintf(fout, "%lld\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}