题目链接:Rikka with Ants
sol:
类欧几里得,推荐博客 https://blog.csdn.net/WorldWide_D/article/details/54730588
这里记录下扒来的最基础的板子,可以计算形如
的值,在某些题中可以计算整点个数。
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;
}