Pagini recente » Cod sursa (job #2484522) | Cod sursa (job #1179702) | Cod sursa (job #1786678) | Cod sursa (job #319569) | Cod sursa (job #1631954)
// problema incearca sa afle numarul de fractii distincte a/b cu a,b < n
// foloseste Sieve of Erathosthene
#include<stdio.h>
#include<vector>
using namespace std;
//long long prime[100000];
int nr_prime;
vector<long> prime;
void calculeazaprime(){
long long i,j;
int gasit;
nr_prime = 0;
for( i = 2; i <= 1000000; i++){
gasit = 0;
for( j = 0; j < nr_prime; j++)
if( i % prime[j] == 0){
gasit = 1;
break;
}
if( gasit == 0)
prime[nr_prime++] = i;
}
}
void calculeazaprime2(){
char b[1000000];
long i, j;
for( i = 0; i < 1000000; i++)
b[i] = 1;
for( i = 2; i < 1000000; i++){
if( b[i] ){
prime.push_back(i);
for(j = 2; j <= 1000000 / i; j++)
b[i * j] = 0;
}
}
}
long long nr_rel_prim(long nr){
// printf("mi-a intrat in functie cu nr = %ld \n", nr);
// return 0;
long long ret;
ret = 1;
long i, prim;
i = 0;
while( nr >= prime[i] * prime[i]){
// printf("compar %ld cu %ld\n", nr, prime[i]);
prim = prime[i];
if( nr % prim == 0){
nr /= prim;
ret *= (prim - 1);
while( nr && (nr % prim == 0) ){
nr /= prim;
ret *= prim;
}
}
i++;
}
if( nr > 2)
ret *= (nr - 1);
// printf("pt nr = %lld returnez %lld\n",nr, ret);
return ret;
}
int main(){
long n;
long long rez;
rez = 0;
FILE *f = fopen("fractii.in", "r");
fscanf(f, "%ld", &n);
fclose(f);
// printf("n = %ld\n", n);
long i;
calculeazaprime2();
// printf("aici n = %ld\n", n);
// return 0;
// printf("mi-a iesit din functio\n");
rez++;
for( i = 2; i <= n; i++){
// printf("aici i = %ld, n = %ld\n",i,n);
rez += 2 * nr_rel_prim(i);
}
f = fopen("fractii.out", "w");
fprintf(f, "%lld", rez);
fclose(f);
return 0;
}