Cod sursa(job #1318070)

Utilizator b10nd3Oana Mancu b10nd3 Data 15 ianuarie 2015 15:56:24
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<math.h>




using namespace std;

int n;
int p[1000001];



/*p[i]= how many numbers are smaller than i
  eg: n=10 => p={0,1,2,3,4,5,6,7,8,9} 
*/
void initiate_p(){
	for(int i=1;i<=n;i++) p[i]=i-1;
}


/*
  p={0,1,2,3,4,5,6,7,8,9}
  i=2 j=4 => 2*2=4 =>p[2]=p[4]-[2]=3-1=2
  ...
  p={0,1,2,2,4,4,6,6,8,9}
  
  i=3 => p={0,1,2,2,4,2,6,6,6,8}
  i=4=> p={0,1,2,2,4,2,6,4,6,8}
  
  i=5 j=10 
  pt 5 avem 4 nr prime cu el, mai mici decat 5: {1,2,3,4}. p[5]=4
  10=2*5 => 2*1, 2*2, 2*3, 2*4 nu sunt prime cu 10
  => p[j]=p[j]-p[i]
  =>p={0,1,2,2,4,2,6,4,6,4}
  
  dc aveam i=5 j=15 => 5*3=15, cu aceleasi nr prime pt 5, mai mici decat 5: {1,2,3,4}
  => 3*1, 3*2, 3*3, 3*4 nu sunt prime cu 15
*/

void find_no_of_primes_with_each_no(){
   for(int i=2;i<=n;i++)
     for(int j=i*2;j<=n;j=j+i)
        p[j]=p[j]-p[i];	
}


long long sum(){
	long long s=0;
	for(int i=0;i<=n;i++) s=s+p[i];
	s=s*2;   // (1,2) prime intre ele => 1/2 si 2/1, etc =>s=s*2
	s=s+1;  // 1/1
	return s;
}


int main(){
ifstream in; ofstream out;
in.open("fractii.in"); out.open("fractii.out");
out.clear();
in>>n;

initiate_p();
find_no_of_primes_with_each_no();
out<<sum();


return 0;	
}