#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#include<iostream>
using namespace std ;
/*扩展欧几里得
ax + by = c ;
若c != gcd ( a , b ) ;则无解
ax + by = gcd ( a , b ) ;
b * x' + a%b * y' = gcd ( a , b ) ;
ax + by = b x' + a%b y' ;
ax + by = b x' + ( a - ( a / b ) * b ) y' ;
a ( x - y' ) = b ( ( x' - a / b * y' ) - y ) ;
x = y' ; y = x' - y' * ( a / b ) ;
ax + by = d ;
a(x+bt) + b(y-at) = d ;
*/
void extend_gcd ( ll a , ll b , ll &d , ll &x , ll &y ) {
if ( !b ) d = a , x = 1 , y = 0 ;
else extend_gcd ( b , a % b , d , y , x ) , y -= x * ( a / b ) ;
}
ll lcm ( ll a , ll b ) {
ll x , y , d ;
extend_gcd ( a , b , d , x , y ) ;
return a / d * b ;
}
int main () {
int cas ;
scanf ( "%d" , &cas ) ;
while ( cas -- ) {
ll a1 , d1 , n1 , a2 , d2 , n2 ;
cin >> n1 >> a1 >> d1 >> n2 >> a2 >> d2 ;
ll t = lcm ( d1 , d2 ) ;
ll k1 = t / d1 , k2 = t / d2 ;
if ( a1 == a2 ) {
cout << min ( n1 / k1 + ( n1 % k1 != 0 ) , n2 / k2 + (( n2 % k2 ) != 0) ) << endl ;
continue ;
}
ll x , y , d ;
ll f = a2 - a1 ;
extend_gcd ( d1 , -d2 , d , x , y ) ;
if ( f % d ) {
puts ( "0" ) ;
continue ;
}
ll temp = f / d ;//得到相应的倍数
x *= temp , y *= temp ;
if ( d < 0 ) d = -d ;
x = ( x % ( d2 / d ) + d2 / d ) % ( d2 / d ) ;//求得最小的正x
y = ( a1 + d1 * x - a2 ) / d2 ;
if ( y < 0 ) {
puts ( "0" ) ;
continue ;
}
ll m1 = n1 - x , m2 = n2 - y ;
m1 = m1 / k1 + ( m1 % k1 != 0 ) ;
m2 = m2 / k2 + ( m2 % k2 != 0 ) ;
cout << max ( (ll)0 , min ( m1 , m2 ) ) << endl ;
}
return 0 ;
}
Modified LCS(扩展欧几里得)
最新推荐文章于 2020-02-02 19:22:08 发布