#include #include #include int num[432]; //int num[20]; int primes[500]; int idx[500]; int list[500]; inline int is_prime(int i) { return primes[i]; } void gen_primes() { memset(primes,1,sizeof(primes)); primes[0]=0; primes[1]=0; for (int i=2;i<500;i++) { for (int j=i+i;j<500;j+=i) primes[j]=0; } int id=0; memset(idx,-1,sizeof(idx)); memset(list,0,sizeof(list)); for (int i=2;i<500;i++) { if (is_prime(i)) { idx[i]=id; list[id]=i; id++; } } // for (int i=0;i<40;i++) // if (is_prime(i)) printf("%d ",i); // printf("\n"); // for (int i=0;i<30;i++) // printf("%d ",idx[i]); // printf("\n"); // for (int i=0;i<30;i++) // printf("%d ",list[i]); // printf("\n"); } int next_prime(int number,int prime) { if (number==1) return -1; int res=-1; int id=idx[prime]; for (int i=id;list[i]<=number;i++) { int prime_num=list[i]; if (!(number%prime_num)) { res=prime_num; break; } } return res; } int main() { int n,k; gen_primes(); // printf("%d",next_prime(9,2)); // return 0; while (scanf("%d%d",&n,&k)!=EOF) { if (n-kn-k;num[i--]=1); for (int i=2;i<=k;num[i++]=-1); // for (int i=0;i<20;i++) // printf("%d ",num[i]); // printf("\n"); for (int i=n;i>1;i--) { if (is_prime(i)) continue; int number=i; int newval=num[i]; // printf("number=%d\n",number); for (int pr=2;pr<=number;) { pr=next_prime(number,pr); // printf("prime=%d\n",pr); // if (pr==i) break; if (pr==-1) { num[i]=0; break; } if (pr!=number) newval=0; number/=pr; // printf("prime %d: num %d -> num %d\n",pr,number*pr,number); num[pr]+=num[i]; } num[i]=newval; // printf("\n"); // break; } // for (int i=0;i<432;i++) // num[i]++; // for (int i=0;i<20;i++) // printf("%d ",num[i]); // printf("\n"); // printf("size=%d",sizeof(unsigned long)); // printf("size=%d",sizeof(unsigned long long)); unsigned long long result=1; for (int i=2;i<432;i++) result=result*(unsigned long long)(num[i]+1); printf("%llu\n",result); } return 0; }