Pagini recente » Cod sursa (job #2779561) | Cod sursa (job #549736) | Cod sursa (job #2066093) | Cod sursa (job #2280865) | Cod sursa (job #2396096)
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
long long di [1001],dp[1001][1001];
int elem=0;
int find_poz (int x){
int st,dr,mid;
st=1;
dr=elem;
while (st<=dr){
mid=(st+dr)/2;
if (di[mid]==x)
return mid;
else if (di[mid]<x)
st=mid+1;
else dr=mid-1;
}
return 0;
}
int main()
{
FILE *fin=fopen ("desc.in","r");
FILE *fout=fopen ("desc.out","w");
int k,i;
long long n,d,n2;
fscanf (fin,"%lld",&n);
fscanf (fin,"%d",&k);
d=1;
while (d*d<=n){
if (n%d==0){
di[++elem]=d;
if (d!=n/d)
di[++elem]=n/d;
}
d++;
}
/// maxim 2 * 10 ^ 6 divizori
sort (di+1,di+elem+1);
/// dp[i][j] = folosind divizori de la 1..i sa ai produsul j
dp[1][1]=1;
for (i=2;i<=elem;i++){
//if (di[i]==4)
// printf ("a");
dp[i][i]=1;
for (int j=2;j<i;j++){
if (di[i]%di[j]==0) /// adaugi un di[j] la di[i]/di[j]
dp[i][j]+=dp[find_poz(di[i]/di[j])][j];
}
for (int j=1;j<=elem;j++)
dp[i][j]+=dp[i][j-1];
}
fprintf (fout,"%lld\n",dp[elem][elem]);
return 0;
}