Cod sursa(job #2349910)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 20 februarie 2019 20:31:54
Problema Fractii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <bits/stdc++.h>
#define NMAX 1010
#define ll long long
using namespace std;

bool E[NMAX];
vector <int> P;

int f(int b){
	//Calculam factorii primi ai lui b
	vector <int> Dc;
	Dc.clear();
	int s=b,i=0;
	while(b>1){
		if(b%P[i]==0){
			Dc.push_back(P[i]);
			while(b%P[i]==0)b/=P[i];
		}
		if(b>1 && P[i]>sqrt(b)){
			Dc.push_back(b);
			b=1;
		}
		i++;
	}
	b=s;
	//Calculam nr de elemente neprime si il scadem din a
	int l=Dc.size();
	for(int i=1;i<(1<<l);i++){
		int c=0;
		int fact=1;
		for(int j=0;j<l;j++){
			if((1<<j)&i){
				fact*=Dc[j];
				c++;
			}
		}
		if(c%2)s-=b/fact;
		else s+=b/fact;
	}
	return s*2;	
}

int main(){
	ifstream cin("fractii.in");
	ofstream cout("fractii.out");
	int n,l;
	cin>>n;
	l=min(n,NMAX);
	for(int i=2;i<=l;i++){
		if(!E[i]){
			P.push_back(i);
			for(int j=i*i;j>0 && j<=l;j+=i){
				E[i]=1;
			}
		}
	}
	ll s=1;
	for(int i=2;i<=n;i++){
		s+=f(i);//Calculeaza nr de numere prime cu i pana la n
	}
	cout<<s;
	return 0;
}