Pagini recente » Cod sursa (job #2386119) | Cod sursa (job #2433406) | Cod sursa (job #2583537) | Cod sursa (job #2929271) | Cod sursa (job #1693951)
#include <fstream>
#include <iostream>
using namespace std;
fstream f,g;
long long n,i,j,v[1000000],st[8],nrprime,sol,base,cell,fr,nr,sign,p,m;
void bkt2(int i)
{
if(i<=m)
{
long long j;
for(j=1;cell<=n;j*=v[st[i]],cell*=v[st[i]])bkt2(i+1);
cell/=j;
}
else nr++;
}
void bkt3(int i)
{
if(i<=m)
{
sign*=-1;
p*=v[st[i]];
bkt3(i+1);
sign*=-1;
p/=v[st[i]];
bkt3(i+1);
}
else fr+=sign*(n-n/p);
}
void bkt1(int i)
{
nr=0;fr=0;
cell=base;
bkt2(1);
bkt3(1);
sol+=nr*fr;
m++;
for(st[i]=st[i-1]+1,base*=v[st[i]];st[i]<=nrprime&&base<=n;st[i]++,base=base/v[st[i]-1]*v[st[i]])bkt1(i+1);
base/=v[st[i]];
m--;
}
int main()
{
//bkt1 face structura nr prime, bkt 2 face nr de fractii pt o structura, bkt 3 genereaza nrele cu aceea structura
f.open("fractii.in",ios_base::in);
g.open("fractii.out",ios_base::out);
f>>n;
for(i=2;i<=n;i++)if(v[i]==0)
{
nrprime++;
v[nrprime]=i;
for(j=i*2;j<=n;j+=i)v[j]=1;
}
v[nrprime+1]=1;
sol=n;
p=1;
sign=-1;
base=1;
bkt1(1);
g<<sol;
}