Pagini recente » Cod sursa (job #340598) | Cod sursa (job #1427399) | Cod sursa (job #1005851) | Cod sursa (job #1266571) | Cod sursa (job #2396092)
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
long long di [1001],dp[101][101];
map <long long,int> f;
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);
n2=n;
d=2;
while (d*d<=n2){
if (n2%d==0){
f[d]=1; /// d e unul dintre divizorii primi
while (n2%d==0)
n2/=d;
}
d++;
}
if (n2!=1){
f[n2]=1; /// n2 e unul din divizorii primi
}
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;
}