#include #include #include int num[432]; //int num[20]; int primes[500]; 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; } // for (int i=0;i<500;i++) // if (is_prime(i)) printf("%d ",i); // printf("\n"); } int next_prime(int number,int prime) { if (number==1) return -1; int res=-1; for (int i=prime;i<=number;i++) { if (is_prime(i) && (!(number%i))) { res=i; break; } } return res; } int main() { int n,k; gen_primes(); // printf("%d",next_prime(9,2)); // return 0; scanf("%d%d",&n,&k); 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; }