Cod sursa(job #232920)

Utilizator geoNechifor George geo Data 16 decembrie 2008 13:31:00
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
/*
 * main.cpp
 *
 *  Created on: Dec 16, 2008
 *      Author: uidn3527
 */
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int totients[1000001];
void getdivizor(int nr,int &div,int &pow,int &remain)
{
	if (nr %2 == 0)
	{
		div = 2;
		pow = 1;
		nr /=2;
		while (nr % 2 ==0)
		{
			nr = nr / 2;
			pow*=2;
		}
		remain = nr;
		return;
	}
	for (int d=3;d<=sqrt(nr);d+=2)
	{
		if (nr%d==0)
		{
			div = d;
			pow =1;
			nr /=d;
			while (nr % d ==0)
			{
				nr = nr / d;
				pow*=d;
			}
			remain = nr;
			return;
		}
	}
	div = nr;
	pow = 1;
	remain = 1;
	return;
}
int main(int argc, char **argv)
{
	ifstream fin("fractii.in");
	ofstream fout("fractii.out");
	totients[1]=1;
    int div;
    int pow;
    int remain;
    for (int i=2;i<=1000000;i++)
    {
    	getdivizor(i,div,pow,remain);
    	totients[i]=totients[remain]*((div-1)*pow);
    }
    int nr;
    fin>>nr;
    long long answ=0;
    for (int i=1;i<=nr;i++)
    	answ+=(long long)totients[i];
    answ*=2LL;
    answ-=1LL;
    fout<<answ<<endl;
    fin.close();
    fout.close();
}