Cod sursa(job #1727265)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 10 iulie 2016 13:18:36
Problema Puteri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <cstring>
#define MAXE 64
#define MAXC 128
#define MAXN 100000
bool prim[MAXC+1];
int s[MAXE+1][MAXE+1][MAXE+1];
int mobius[MAXC+1], g[MAXC+1];
int n, a[MAXN], b[MAXN], c[MAXN];
inline long long solve(int mod){
    int i, a1, b1, c1;
    long long ans=0;
    memset(s, 0, sizeof s);
    for(i=0; i<=MAXC; i++) g[i]=i%mod;
    for(i=0; i<n; i++){
        a1=g[mod-g[a[i]]], b1=g[mod-g[b[i]]], c1=g[mod-g[c[i]]];
        if((a1<=MAXE)&&(b1<=MAXE)&&(c1<=MAXE)) ans+=s[a1][b1][c1];
        s[g[a[i]]][g[b[i]]][g[c[i]]]++;
    }
    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=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;
}