Cod sursa(job #1799002)

Utilizator robx12lnLinca Robert robx12ln Data 5 noiembrie 2016 17:33:31
Problema Sum Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<fstream>
#include<cstring>
#define DIM 200000
using namespace std;
ifstream fin("sum.in");
ofstream fout("sum.out");
int v[DIM / 2], k, n, x, a[15], nr, f[15];
char w[DIM + 5];
long long pinex( int m ){
    long long sum = 0;
    memset( f, 0, sizeof(f) );
    while( f[0] != 1 ){
        int i = m;
        while( f[i] == 1 ){
            f[i] = 0;
            i--;
        }
        f[i] = 1;
        if( i == 0 ){
            break;
        }
        int sign = -1;
        int number = 1;
        for( i = 1; i <= m; i++ ){
            if( f[i] == 1 ){
                sign *= -1;
                number *= a[i];
            }
        }
        int nr1 = ( 2 * x / number );
        nr1 = nr1 * (nr1 + 1) / 2;
        sum += 1LL * sign * number * nr1;
    }
    return sum;
}
int main(){
    w[0] = w[1] = 1;
    for( int i = 2; i <= DIM; i++ ){
        if( w[i] == 0 ){
            v[++k] = i;
            for( int j = i + i; j <= DIM; j += i ){
                w[j] = 1;
            }
        }
    }
    fin >> n;
    for( int i = 1; i <= n; i++ ){
        fin >> x;
        nr = 0;
        int save = x;
        for( int j = 1; v[j] * v[j] <= save && x != 1; j++ ){
            if( x % v[j] == 0 ){
                a[++nr] = v[j];
                while( x % v[j] == 0 ){
                    x /= v[j];
                }
            }
        }
        if( x != 1 ){
            a[++nr] = x;
        }
        x = save;
        fout << 1LL * x * ( 2 * x + 1 ) - pinex(nr) << "\n";
    }
    return 0;
}