Advertisement
NAbdulla

play with floor and seil(extended euclid matrix application)

May 12th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <utility>
  5.  
  6. using namespace std;
  7.  
  8. long long gcd(long long a, long long b)
  9. {
  10.     if(b == 0)return a;
  11.     else gcd(b, a%b);
  12. }
  13.  
  14. pair<long long, long long> eucl(long long a, long long b)
  15. {
  16.     pair<long long, long long> p;
  17.     long long matr[2][3], q;            ///[a 1 0]
  18.                                         ///[b 0 1]
  19.     matr[0][0] = a;
  20.     matr[0][1] = 1;
  21.     matr[0][2] = 0;
  22.  
  23.     matr[1][0] = b;
  24.     matr[1][1] = 0;
  25.     matr[1][2] = 1;
  26.  
  27.     while(1){
  28.         if(matr[0][0] == 0){
  29.             p.first = matr[1][1];
  30.             p.second = matr[1][2];
  31.             return p;
  32.         }
  33.         else if(matr[1][0] == 0){
  34.             p.first = matr[0][1];
  35.             p.second = matr[0][2];
  36.             return p;
  37.         }
  38.  
  39.         if(a > b){
  40.             q = a/b;
  41.             matr[0][0] -= matr[1][0]*q;
  42.             matr[0][1] -= matr[1][1]*q;
  43.             matr[0][2] -= matr[1][2]*q;
  44.         }
  45.         else if(a < b){
  46.             q = b/a;
  47.             matr[1][0] -= matr[0][0]*q;
  48.             matr[1][1] -= matr[0][1]*q;
  49.             matr[1][2] -= matr[0][2]*q;
  50.         }
  51.  
  52.         a = matr[0][0];
  53.         b = matr[1][0];
  54.     }
  55. }
  56.  
  57. int main()
  58. {
  59.     long long x, k, p, q, a, b, t, g;
  60.     pair<long long, long long>pa;
  61.     scanf("%lld", &t);
  62.     while(t--){
  63.         scanf("%lld %lld", &x, &k);
  64.         a = floor(((double)x/(double)k));
  65.         b = ceil(((double)x/(double)k));
  66.         g = gcd(max(a, b), min(a, b));
  67.         if(a == b){
  68.             p = 0;
  69.             q = 1;
  70.         }
  71.         else{
  72.             pa = eucl(a, b);
  73.             p = pa.first;
  74.             q = pa.second;
  75.         }
  76.  
  77.         printf("%lld %lld\n", x*p/g, x*q/g);
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement