Pagini recente » Cod sursa (job #584859) | Cod sursa (job #1747908) | Cod sursa (job #3139083) | Cod sursa (job #2607035) | Cod sursa (job #586148)
Cod sursa(job #586148)
#include<stdio.h>
#include<math.h>
#define ll long long
#define NMAX 100005
#define minim(a,b) (a<b ? a : b)
char prim[NMAX];
ll n,ram,plus,sol[NMAX],nrs,nrp;
ll vec[NMAX],v[NMAX],t[NMAX],s[NMAX];
int main ()
{
int i,j,p,poz;
ll lim;
freopen("nummst.in","r",stdin);
freopen("nummst.out","w",stdout);
scanf("%lld",&n);
if(n%2==0)
{
printf("%lld %lld\n",n/2,n/2);
return 0;
}
lim=sqrt(n);
plus=1;
ram=n;
for(i=2;i<=lim;i++)
if(n&i==0)
{
plus=n/i;
ram=i;
break;
}
lim=minim(ram,100006);
for(i=2;i<=lim;i++)
if(!prim[i])
for(j=i*i;j<=lim;j+=i)
prim[j]=1;
for(i=2;i<=lim;i++)
if(!prim[i])
{
v[++nrp]=i;
t[nrp]=i;
vec[nrp]=i;
}
while(1)
{
for(i=1;i<=nrp;i++)
s[i]=s[i-1]+v[i];
for(i=1;i<=nrp;i++)
if(s[i]>ram)
break;
poz=i-1;
if(!poz)
break;
for(j=poz;j<=nrp;j++)
if(s[j]-s[j-poz]>ram)
break;
p=j-1;
ram-=(s[p]-s[p-poz]);
for(i=p-poz+1;i<=p;i++)
{
v[i]=t[i]*vec[i]-t[i];
t[i]*=vec[i];
}
}
for(i=1;i<=nrp;i++)
if(t[i]!=vec[i])
sol[++nrs]=t[i]/vec[i]*plus;
if(ram)
sol[++nrs]=ram*plus;
for(i=1;i<=nrs;i++)
printf("%lld ",sol[i]);
printf("\n");
return 0;
}