牛客多校round10 H.Rikka with Ants

题目链接:Rikka with Ants

sol:

类欧几里得,推荐博客 https://blog.csdn.net/WorldWide_D/article/details/54730588
这里记录下扒来的最基础的板子,可以计算形如 f ( a , b , c , n ) = i = 0 n a i + b c 的值,在某些题中可以计算整点个数。

code:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef __int128 lll;
const int mod = 998244353;
const int inv2 = (mod + 1)>>1;

ll Cal(ll a,ll b,ll c,ll n){
    if(a==0)
        return (b/c)*(n+1) % mod;
    if(a>=c)
        return (n*(n+1)/2 % mod *(a/c) % mod + Cal(a%c,b,c,n)) % mod;
    if(b>=c)
        return ((b/c) * (n+1) % mod + Cal(a,b%c,c,n)) % mod;
    ll m = (n/c * a + (n%c*a + b)/c);
    return ((m%mod) * (n%mod) % mod - Cal(c,c-b-1,a,m-1) + mod) % mod;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        ll a,b,c,d;
        scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
        if(a* d > b * c){
            swap(a,c);
            swap(b,d);
        }
        if(a * d == b*c){
            puts("-1");
            continue;
        }
        ll n = b*(c+d)/(b*c - a*d);
        ll ans = Cal(a,a+b,b,n-1) + mod - Cal(c,0,d,n-1);
        ans %= mod;
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/oWuHen12/article/details/82292190