Pagini recente » Cod sursa (job #3157256) | Cod sursa (job #2855917) | Cod sursa (job #497045) | Cod sursa (job #629705) | Cod sursa (job #68683)
Cod sursa(job #68683)
#include <math.h>
#include <fstream>
using namespace std;
long prime[1000001], n, p[1000001];
void citire(){
ifstream in("fractii.in");
in >> n;
}
void eratostene(){
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){
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 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();
eratostene();
ofstream out("fractii.out");
out << suma();
out.close();
return 0;
}