Advertisement
a53

Arithmetic Equality

a53
Nov 19th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. const int MOD = 1e9 + 7;
  6. const int NMAX = 1e5;
  7.  
  8. int digits, sol;
  9.  
  10. int fact[NMAX + 5], invFact[NMAX + 5];
  11.  
  12. int LgPut(int base, int exp)
  13. {
  14. int ans = 1, aux = base;
  15.  
  16. for(int i = 1; i <= exp; i <<= 1)
  17. {
  18. if(i & exp)
  19. ans = (1LL * ans * aux) % MOD;
  20.  
  21. aux = (1LL * aux * aux) % MOD;
  22. }
  23.  
  24. return ans;
  25. }
  26.  
  27. void PrecFact()
  28. {
  29. fact[0] = 1;
  30. for(int i = 1; i <= digits; i++)
  31. fact[i] = (1LL * i * fact[i - 1]) % MOD;
  32.  
  33. invFact[0] = 1;
  34. for(int i = 1; i <= digits; i++)
  35. invFact[i] = LgPut(fact[i], MOD - 2);
  36. }
  37.  
  38. int Comb(int n, int k)
  39. {
  40. int res = fact[n];
  41. res = (1LL * res * LgPut(fact[k], MOD - 2)) % MOD;
  42. res = (1LL * res * LgPut(fact[n - k], MOD - 2)) % MOD;
  43. return res;
  44. }
  45.  
  46. int st[11];
  47. void CheckSol(int prod, int sum, int digitsLeft)
  48. {
  49. if(prod == sum + digitsLeft)
  50. {
  51. int currSol = 1, d = digits;
  52.  
  53. for(int i = 2; i <= 9; i++)
  54. {
  55. currSol = (1LL * currSol * Comb(d, st[i])) % MOD;
  56. d -= st[i];
  57. }
  58.  
  59. sol = (sol + currSol) % MOD;
  60. }
  61. }
  62.  
  63. void bk(int currDigit, int prod, int sum, int digitsLeft)
  64. {
  65. if(currDigit == 10)
  66. {
  67. CheckSol(prod, sum, digitsLeft);
  68. return ;
  69. }
  70.  
  71. st[currDigit] = 0;
  72. bk(currDigit + 1, prod, sum, digitsLeft);
  73.  
  74. int pp = prod, ss = sum, dl = digitsLeft;
  75.  
  76. for(int i = 1; i <= 20; i++)
  77. if(pp * currDigit <= 9 * digits)
  78. {
  79. st[currDigit] = i;
  80. pp *= currDigit;
  81. ss += currDigit;
  82. dl--;
  83.  
  84. if(dl < 0)
  85. break;
  86.  
  87. bk(currDigit + 1, pp, ss, dl);
  88. }
  89. else
  90. {
  91. break;
  92. }
  93. }
  94.  
  95. int main()
  96. {
  97. cin >> digits;
  98.  
  99. if(digits == 1)
  100. {
  101. cout << 10 << '\n';
  102. return 0;
  103. }
  104.  
  105. PrecFact();
  106.  
  107. bk(2, 1, 0, digits);
  108.  
  109. cout << sol << '\n';
  110.  
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement