Matrix_code

math - Solution of linear diaphantine equation.

Feb 11th, 2017 (edited)
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. // Number of solutions of a diaphantine equation. in a range
  2. // Tested - LOJ 1306
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. typedef long long i64d;
  6.  
  7. i64d x, y, d;
  8.  
  9. void extEuclid(i64d a, i64d b) {
  10.    if (b == 0) { x = 1; y = 0; d = a; return; }
  11.    extEuclid(b, a % b);
  12.    x = x - (a / b) * y;
  13.    swap(x, y);
  14. }
  15. // solution of ax+by=c, where x1<=x<=x2, y1<=y<=y2
  16. i64d solve(i64d a,i64d b,i64d c,i64d x1,i64d x2,i64d y1,i64d y2)
  17. {
  18.    
  19.    if(a==0&&b==0){
  20.       if(c==0) return (x2-x1+1)*(y2-y1+1);
  21.       return 0;
  22.    }
  23.    if(a==0){
  24.       if(c%b==0 && y1 <= c/b &&  c/b <= y2)  return (x2-x1+1);
  25.       return 0;
  26.    }
  27.    if(b==0) {
  28.       if(c%a==0 && x1 <= c/a && c/a <= x2) return (y2-y1+1);
  29.       return 0;
  30.    }
  31.    extEuclid(a,b);
  32.    if(c%d==0) {
  33.       x *= c/d, y *= c/d;
  34.       b /= d , a /= d;
  35.       swap(a,b);
  36.       double p = (x1-x)/(double) a , q = (x2-x)/(double) a;
  37.       if(p>q) swap(p,q);
  38.       x1 = (i64d) ceil(p), x2 = (i64d ) floor(q);
  39.      
  40.       p = (y - y1)/(double)b, q  = (y - y2) / (double)b ;
  41.       if(p>q) swap(p,q);
  42.       y1 = (i64d) ceil(p) , y2 = (i64d) floor(q);
  43.      
  44.       x1 = max(x1,y1), x2 = min(x2,y2);
  45.       return max(0LL , x2-x1+1);
  46.    }
  47.    return 0;
  48. }
  49.  
  50. int main()
  51. {
  52.    int t,cs=0,a,b,c,x1,y1,x2,y2;
  53.    scanf("%d",&t);
  54.    while(t--) {
  55.       scanf("%d %d %d %d %d %d %d",&a,&b,&c,&x1,&x2,&y1,&y2);
  56.       printf("Case %d: %lld\n",++cs, solve(a,b,-c,x1,x2,y1,y2));
  57.    }
  58. }
Add Comment
Please, Sign In to add comment