类欧几里得算法模板

类欧几里得算法

\(View\) \(Code\)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int ret=0,f=1;
    char ch=getchar();
    while('9'<ch||ch<'0')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while('0'<=ch&&ch<='9')
    {
        ret=(ret<<1)+(ret<<3)+ch-'0';
        ch=getchar();
    }
    return ret*f;
}
inline long long readl()
{
    long long ret=0;
    int f=1;
    char ch=getchar();
    while('9'<ch||ch<'0')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while('0'<=ch&&ch<='9')
    {
        ret=(ret<<1)+(ret<<3)+ch-'0';
        ch=getchar();
    }
    return ret*f;
}
const int mod=998244353;
int T;
long long n,a,b,c;
long long query(long long a,long long b,long long c,long long n)
{
    if(!a)
        return (n+1)*(b/c)%mod;
    if(c<=a||c<=b)
        return (n*(n+1)/2%mod*(a/c)%mod+(n+1)*(b/c)%mod+query(a%c,b%c,c,n)%mod)%mod;
    long long m=(a*n+b)/c,ret=n*m%mod-query(c,c-b-1,a,m-1);
    while(ret<0)
        ret+=mod;
    return ret%mod;
}
int main()
{
    T=read();
    while(T--)
    {
        n=readl();
        a=readl();
        b=readl();
        c=readl();
        printf("%lld\n",query(a,b,c,n)%mod);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Peter0701/p/11869911.html