Pagini recente » Cod sursa (job #674885) | Cod sursa (job #301364) | Cod sursa (job #2908650) | Cod sursa (job #2265644) | Cod sursa (job #424959)
Cod sursa(job #424959)
#include<stdio.h>
FILE *f=fopen("desc.in","r");
FILE *g=fopen("desc.out","w");
long long div[1001],n,k,a[1001][1001],nrdiv,i,j,p,x,y,u,m;
void divide(){
for(long long d=2;d<=n/2;d++)
if(n%d==0){
div[0]++;
div[div[0]]=d;
}
div[0]++;
div[div[0]]=n;
nrdiv=div[0];
}
long long caut(long long y){
if(y==1)
return 1;
p=1;
u=nrdiv;
while(p<=u){
m=(p+u)/2;
if(div[m]>y)
u=m-1;
else if(div[m]<y)
p=m+1;
else return m;}
return 0;
}
int main(){
//citire
fscanf(f,"%lld%lld",&n,&k);
//divizorii lui n
divide();
//initializam prima linie cu 1
for(i=1;i<=nrdiv;i++)
a[1][i]=1;
for(i=2;i<=nrdiv;i++)
for(j=1;j<=nrdiv;j++){
a[i][j]=a[i][j-1]; //valoarea anterioara
if(i>=j&&div[i]%div[j]==0) //daca se imparte
{ y=div[i]/div[j]; //trebuie sa cautam pozitia divizorului p
x=caut(y);
a[i][j]+=a[x][j];
}
}
fprintf(g,"%lld",a[nrdiv][nrdiv]);
return 0;
}