Advertisement
a53

divizori5

a53
Jun 8th, 2019
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.63 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. using namespace std;
  4. ifstream cin ("divizori.in");
  5. ofstream cout ("divizori.out");
  6. const int MOD = (int)3e6 + 17;
  7. long long d;
  8. int m,k,P,sol,nrPrime;
  9. int p[100005],inv[205];
  10. bool ciur[1000005];
  11.  
  12. int lgput(int n,int p)
  13. {
  14. int sol=1,x=n;
  15. for(int i=0;(1<<i)<=p;++i)
  16. {
  17. if((1<<i)&p)
  18. sol=1LL*sol*x%MOD;
  19. x=1LL*x*x%MOD;
  20. }
  21. return sol;
  22. }
  23.  
  24. int comb(int n,int k)
  25. {
  26. if(n < k)
  27. return 0;
  28. int sol=1;
  29. for(int i=n-k+1;i<=n;++i)
  30. sol=1LL*sol*i%MOD;
  31. for(int i=2;i<=k;++i)
  32. sol=1LL*sol*inv[i]%MOD;
  33. return sol;
  34. }
  35.  
  36. int main()
  37. {
  38. cin >> d >> k >> P;
  39. if(d % 2 == 0) {
  40. m++;
  41. while(d % 2 == 0)
  42. d /= 2, p[m]++;
  43. }
  44. for(int i = 3; 1LL * i * i <= d; i += 2) {
  45. if(d % i == 0) {
  46. m++;
  47. while(d % i == 0)
  48. d /= i, p[m]++;
  49. }
  50. }
  51. if(d > 1)
  52. p[++m]++;
  53. sol = 1;
  54. for(int i = 1; i <= 200; i++)
  55. inv[i] = lgput(i, MOD - 2);
  56. for(int i = 1; i <= m; i++)
  57. sol = 1LL * sol * comb(k + p[i] - 1, k - 1) % MOD;
  58. int lst = sol;
  59. for(int i = 1; i < k; i++) {
  60. for(int j = 1; j <= m; j++)
  61. lst = 1LL * lst * (k - i) * inv[k + p[j] - i] % MOD;
  62. sol += (i % 2 == 0 ? 1LL : -1LL) * comb(k, i) * lst % MOD;
  63. if(sol < 0)
  64. sol += MOD;
  65. if(sol > MOD)
  66. sol -= MOD;
  67. }
  68. ciur[1] = 1;
  69. for(int i = 2; i <= 1000; i++) {
  70. if(!ciur[i]) {
  71. for(int j = i * i; j <= 1000000; j += i)
  72. ciur[j] = 1;
  73. }
  74. }
  75. for(int i = 1; i <= P; i++)
  76. nrPrime += 1 - ciur[i];
  77. cout << 1LL * sol * comb(nrPrime, k) % MOD;
  78. return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement