Pagini recente » Cod sursa (job #2672177) | Cod sursa (job #964722) | Cod sursa (job #2832062) | Viata de dupa olimpiade (partea 2) | Cod sursa (job #1799021)
#include<cstdio>
#include<cstring>
#define DIM 200000
using namespace std;
FILE * fin = fopen("sum.in","r");
FILE * fout = fopen("sum.out","w");
int v[DIM / 2], k, n, x, a[15], nr, f[15];
char w[DIM + 5];
char buffer[DIM / 2 + 5];
int pos = 0;
void citeste( int &numar ){
numar = 0;
while( buffer[pos] < '0' || buffer[pos] > '9' ){
pos++;
if( pos == DIM / 2 ){
fread( buffer, 1, DIM / 2, fin );
pos = 0;
}
}
while( buffer[pos] >= '0' && buffer[pos] <= '9' ){
numar = numar * 10 + ( buffer[pos] - '0' );
pos++;
if( pos == DIM / 2 ){
fread( buffer, 1, DIM / 2, fin );
pos = 0;
}
}
return ;
}
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;
}
}
}
fread( buffer, 1, DIM / 2, fin );
citeste(n);
for( int i = 1; i <= n; i++ ){
citeste(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;
fprintf( fout, "%lld\n", 1LL * x * ( 2 * x + 1 ) - pinex(nr) );
}
return 0;
}