Cod sursa(job #883170)

Utilizator drobertDumitru Robert drobert Data 19 februarie 2013 19:53:19
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
ifstream f("fractii.in");
ofstream g("fractii.out");
long long n,i,j,p,s=1,nr,k,t,sf;
long long eul[100005],prime[1000000];
bool ciur[3000005];

long long powp(long long a,long long b)
{
	long long e,sol=1,aa;
	aa=a;
	for (e=0;(1<<e)<=b;e++)
	{
		if (((1<<e)&b)>0)
			sol=(sol*aa);
		aa=(aa*aa);
	}
	return sol;
}
int main ()
{
	f>>n;
	prime[++prime[0]]=2;
	for (i=4;i<=n;i+=2)
		ciur[i]=1;
	for (i=3;i<=n;i+=2){
		if (!ciur[i])
			prime[++prime[0]]=i;
		for (j=i*i;j<=n;j+=2*i)
			ciur[j]=1;
	}
	for (i=2;i<=n;i++) {
		if (!ciur[i])
			eul[i]=i-1;
		else {
			eul[i]=1;
			nr=i;
			p=1;
			while (nr>1) {
				k=0;
				while (nr%prime[p]==0) {
					k++;
					nr/=prime[p];
				}
				if (k>0)
				{
					eul[i]*=(prime[p]-1);
					t=powp(prime[p],k-1);
					eul[i]*=t;
				}
				p++;
			}
		}
		s+=2*eul[i];
	}
	g<<s<<",";
}