Mai intai trebuie sa te autentifici.
Cod sursa(job #24853)
Utilizator | Data | 3 martie 2007 19:59:29 | |
---|---|---|---|
Problema | Fractii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.72 kb |
#include <stdio.h>
#include <math.h>
#include <string.h>
long nmax,nrprim;
long fract;
long p[1003],prim[800],npr[800];
void citire(){
FILE *in;
in=fopen("fractii.in","r");
fscanf(in,"%ld",&nmax);
fclose(in);
}
void scriere(){
FILE *out;
long fractsf;
out=fopen("fractii.out","w");
fractsf=(2*fract);
fractsf=fractsf+1;
fprintf(out,"%ld",fractsf);
fclose(out);
}
long ciur(){
long i, j, nr = 0;
for (i = 2; i <= nmax; ++i) {
if (p[i] == 0) {
nr++;
for (j = i + i; j <= nmax; j += i) {
p[j] = 1;
}
}
}
return nr;
}
void vectprim(){
long i,j;
j=1;
i=2;
while(j<=nrprim){
if(!p[i]) {prim[j]=i;j++;}
i++;
}
}
long descfactprimi(long k){
long i,j;
int b=1;
i=1;
j=0;
while(k!=1){
if(k%prim[i]==0){
if(b){j++;
npr[j]=prim[i];
b=0;
}
k=k/prim[i];}
else {i++;b=1;}
}
return j;
}
long totient(long k){
long i,nrprimi;
double prod=k;
nrprimi=descfactprimi(k);
if(nrprimi==0) return 0;
// if(k==npr[1]) return k;
for(i=1;i<=nrprimi;i++)
prod=prod*(1-(double)1/npr[i]);
return (long)prod;
}
void procesare(){
long i;
long tot;
nrprim=ciur();
vectprim();
fract=0;
for(i=1;i<=nmax;i++){
tot=totient(i);
fract=fract+tot;
}
}
int main(){
citire();
procesare();
scriere();
return 0;
}