Cod sursa(job #1404428)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 28 martie 2015 10:32:31
Problema Sum Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#define MAXK 6
#define MAXM 266400
#define MAX 100000
int c[MAX+1], val[MAXM+1], next[MAXM+1], lista[MAX+1], d[MAXK];
inline void shmenPetrescu(){
    int i, j, m;
    m=0;
    for(i=2; i<=MAX; i++){
        if(c[i]==0){
            for(j=i; j<=MAX; j+=i){
                c[j]=1;
                val[++m]=i;
                next[m]=lista[j];
                lista[j]=m;
            }
        }
    }
    //printf("%d\n", m);
}
inline long long gauss(long long x){
    return x*(x+1)/2LL;
}
int main(){
    int n, q, k, p, e, prod, i, j, sum;
    FILE *fin, *fout;
    fin=fopen("sum.in", "r");
    fout=fopen("sum.out", "w");
    shmenPetrescu();
    fscanf(fin, "%d", &q);
    while(q>0){
        q--;
        fscanf(fin, "%d", &n);
        k=0;
        p=lista[n];
        while(p!=0){
            d[k++]=val[p];
            p=next[p];
        }
        sum=gauss(2*n);
        for(i=1; i<(1<<k); i++){
            prod=1;
            e=0;
            for(j=0; j<k; j++){
                if(i&(1<<j)){
                    e++;
                    prod*=d[j];
                }
            }
            if(e%2==0){
                sum+=1LL*prod*gauss(2*n/prod);
            }else{
                sum-=1LL*prod*gauss(2*n/prod);
            }
        }
        fprintf(fout, "%d\n", sum);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}