Modified LCS(扩展欧几里得)

Modified LCS(扩展欧几里得)

#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 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值