Advertisement
ahamed210

trailing zeros

Apr 29th, 2021
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef int l;
  5. typedef long long ll;
  6.  
  7. #define ft freopen("input.txt", "r", stdin)
  8. #define loop(a, b) for(int i = a; i < b; i++)
  9.  
  10. l up2, up5;
  11. l down2, down5;
  12. l s, r, p, q;
  13.  
  14. /// formula
  15. /// s!/ (r! * (s-r)!)
  16. /// (s*(s-1)*(s-2)*....*(s-r+1))/ r!
  17.  
  18. void up_count()
  19. {
  20.     up2 = 0, up5 = 0;
  21.  
  22.     ///counting 2 and 5 in s - (s-r+1)
  23.     l range = s-r;
  24.     for(l i = s; i > range; i--){
  25.         l z = i;
  26.         while(z%2 == 0){
  27.             up2++;
  28.             z/=2;
  29.         }
  30.         while(z%5 == 0){
  31.             up5++;
  32.             z/=5;
  33.         }
  34.     }
  35.  
  36.     ///counting 2 and 5 in p^q
  37.     l x = 0;
  38.     l y = 0;
  39.     while(p%2 == 0){
  40.         x++;
  41.         p/=2;
  42.     }
  43.     while(p%5 == 0){
  44.         y++;
  45.         p/=5;
  46.     }
  47.  
  48.     /// (s*(s-1)*(s-2)*....*(s-r+1)) this part and p^q this part will be in upper side
  49.     up2 += (q*x);
  50.     up5 += (q*y);
  51. }
  52.  
  53. ///counting 2 and 5 in r!
  54. void down_count()
  55. {
  56.     down2 = 0, down5 = 0;
  57.     for(l i = 1; pow(2, i) <= r; i++){
  58.         down2 += (r/(pow(2, i)));
  59.     }
  60.     for(l i = 1; pow(5, i) <= r; i++){
  61.         down5 += (r/(pow(5, i)));
  62.     }
  63. }
  64.  
  65. int main()
  66. {
  67.     l n;
  68.     cin >> n;
  69.     loop(0, n){
  70.         cin >> s >> r >> p >> q;
  71.         up_count();
  72.         down_count();
  73.         printf("Case %d: %d\n", i+1, min((up2-down2), (up5-down5)));
  74.     }
  75.     return 0;
  76. }
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement