Pagini recente » Cod sursa (job #364325) | Cod sursa (job #2623411) | Cod sursa (job #3197077) | Cod sursa (job #746923) | Cod sursa (job #425004)
Cod sursa(job #425004)
#include<stdio.h>
#include<stdlib.h>
#include<cmath>
FILE *f=fopen("desc.in","r");
FILE *g=fopen("desc.out","w");
long long divs[2001],n,k,nrdivs,i,j,p,x,y,u,m,a[2001][2001];
int cmp(const void *a,const void *b)
{
long long x = *((long long*)a);
long long y = *((long long*)b);
if (x < y)
return -1;
if (x == y)
return 0;
return 1;
}
void divide(){
long long d;
for(d=2;d<=sqrt(n);d++)
if(n%d==0){
divs[0]++;
divs[divs[0]]=d;
}
nrdivs=divs[0];
for(d=1;d<=nrdivs;d++)
if(n/divs[d]!=divs[d])
{ divs[0]++;
divs[divs[0]]=n/divs[d];
}
divs[0]++;
divs[divs[0]]=n;
nrdivs=divs[0];
qsort(divs+1, nrdivs, sizeof(long long),cmp);
}
long long caut(long long y){
if(y==1)
return 1;
p=1;
u=nrdivs;
while(p<=u){
m=(p+u)/2;
if(divs[m]>y)
u=m-1;
else if(divs[m]<y)
p=m+1;
else return m;}
return 0;
}
int main(){
//citire
fscanf(f,"%lld%lld",&n,&k);
//divsizorii lui n
divide();
//initializam prima linie cu 1
for(i=1;i<=nrdivs;i++)
a[1][i]=1;
for(i=2;i<=nrdivs;i++)
for(j=1;j<=nrdivs;j++){
a[i][j]=a[i][j-1]; //valoarea anterioara
if(i>=j&&divs[i]%divs[j]==0) //daca se imparte
{ y=divs[i]/divs[j]; //trebuie sa cautam pozitia divsizorului p
x=caut(y);
a[i][j]+=a[x][j];
}
}
fprintf(g,"%lld",a[nrdivs][nrdivs]);
return 0;
}