Pagini recente » Cod sursa (job #2444719) | Cod sursa (job #2822033) | Cod sursa (job #2695155) | Cod sursa (job #628228) | Cod sursa (job #65599)
Cod sursa(job #65599)
#include <fstream>
#include <math.h>
using namespace std;
long prime[1000001], n, p[1000001];
void citire() {
ifstream in("fractii.in");
in >> n;
}
void gen_prime() {
// 1 nu e prim
// // 0 e prim
prime[1000000] = 1;
for (long d = 3; d < 1000000; d+=2) {
prime[d - 1] = 1;
if (prime[d] == 0)
for (long v= 2; v*d < 1000000; v++)
prime[d * v] = 1;
}
prime[2] = 0;
}
//long long numar(long nr) {
// //if (prime[nr] == 0)
// // return nr - 1;
// long long p = nr;
//
// if ((nr & 1) == 0) {
// p /= 2;
// while ((nr & 1) == 0)
// nr >>= 1;
// }
// for (long d = 3; d <= nr / d; d +=2) {
//
// if (nr % d == 0 ) {
// p = p * (d - 1) / d;
// while (nr % d == 0) nr /= d ;
// }
// }
// if (nr > 1)
// p = p * (nr - 1) / nr;
// return p;
//}
long long numar(long nr) {
//if (prime[nr] == 0)
// return nr - 1;
int cnt = 0;
while ((nr & 1) == 0) {
nr >>= 1;
cnt++;
}
if (cnt)
return (1 << (cnt -1) ) * p[nr];
for (long d = 3; d <= nr / d; d +=2) {
int cnt = 0;
while (nr % d == 0) {
nr /= d;
cnt++;
}
if (cnt)
return (long long)pow((long double)d, (cnt - 1)) * (d - 1)* p[nr];
}
return nr - 1;
}
//long long numar(long nr) {
// if (prime[nr] == '0')
// return nr - 1;
// long long p = nr;
//
// if ((nr & 1) == 0) {
// p /= 2;
// p = p * (nr / 2 - 1) / (nr / 2);
// }
//
// for (long d = 3; d <= nr / d; d +=2) {
// if (prime[d] == '0' && nr % d == 0 )
// p = p * (d - 1) / d;
// if (prime[nr / d] == '0' && nr % d == 0 )
// p = p * (nr / d - 1) / (nr / d);
// }
// return p;
//}
long long suma() {
long long s = 0 ;
p[1] = 1;
for (long i = 2; i <= n; i++) {
if (prime[i] == 0)
p[i] = i-1;
else {
p[i] = numar(i) ;
}
s += p[i];
}
return 1 + (s << 1);
}
int main() {
citire();
ofstream out("fractii.out");
gen_prime();
out << suma();
out.close();
return 0;
}