Pagini recente » Cod sursa (job #2028714) | Cod sursa (job #239953) | Cod sursa (job #193390) | Cod sursa (job #1296712) | Cod sursa (job #73170)
Cod sursa(job #73170)
using namespace std;
#include<fstream>
#include<math.h>
#define Dmax 2000
ifstream fin("desc.in");
ofstream fout("desc.out");
long long diviz[Dmax],D[Dmax];
int frecv[Dmax],Nd,ND=0;
int A[Dmax][Dmax];
void back(int i,long long Dnou)
{
if(i>Nd)
{
if(Dnou>1)
D[++ND]=Dnou;
return;
}
int k;
long long par=Dnou;
back(i+1,par);
for(k=1;k<=frecv[i];k++)
{
par*= diviz[i];
back(i+1, par);
}
}
int main()
{
long long N,p,V,X;
int K,i,j,k;
fin>>N>>K;
V=N;
//aflare factori
if(V%2==0)
{
Nd=1;
diviz[1]=2;
frecv[1]=0;
while(V%2==0)
{
frecv[1]++;
V>>=1;
}
}
else
Nd=0;
for(p=3;p<= (long long)sqrt((double)V); p+=2)
if(V%p==0)
{
Nd++;
diviz[Nd]=p;
frecv[Nd]=0;
while(V%p==0)
{
V/=p;
frecv[Nd]++;
}
}
if(V>1)
{
diviz[++Nd]=V;
frecv[Nd]=1;
}
back(1,1);
//sort
for(i=1;i<=ND;i++)
{
j=i;
while(j/2 && D[j/2] < D[j])
{
D[j/2]^=D[j], D[j]^=D[j/2], D[j/2]^=D[j];
j>>=1;
}
}
i=ND;
while(i>1)
{
D[1]^=D[i], D[i]^=D[1], D[1]^=D[i];
--i;
j=1;
while(1)
{
k=j<<1;
if(k>i) break;
if(k+1<=i && D[k+1] > D[k]) k++;
if(D[j] > D[k]) break;
D[j]^=D[k], D[k]^=D[j], D[j]^=D[k];
j=k;
}
}
D[0]=1;
for(i=1;i<=ND;i++) A[0][i]=1;
for(j=ND;j;j--)
{
k=0;
for(i=j;i<=ND;i++)
{
A[i][j]= A[i][j+1];
if(D[i] % D[j] == 0)
{
X=D[i]/D[j];
while(D[k] < X) k++;
A[i][j]+= A[k][j];
}
}
}
fout<<A[ND][1]<<"\n";
}