类欧

https://www.luogu.org/blog/shiqingyu/solution-p5170  公式要记

(ai+b)/c;

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int inv2=(mod+1)/2;
ll FF(ll a,ll b,ll c,ll n){  // 0-n  (ai+b)/c;
if(a==0) return (n+1)%mod*(b/c)%mod;
if(n==0) return (b/c)%mod;
if(a>=c || b>=c)
return  ( 1ll*n%mod*(n+1)%mod*inv2%mod*(a/c)%mod+1ll*(n+1)%mod*(b/c)%mod+FF(a%c,b%c,c,n) )%mod;
ll m=(1ll*a*n+b)/c;
return  ( 1ll*(n%mod)*(m%mod)%mod-FF(c,c-b-1,a,m-1))%mod;
}
ll GG(ll a,ll b,ll c,ll n){  // 0-n  ( (ai+b)/c  )*( (ai+b)/c  )
    
}
ll HH(ll a,ll b,ll c,ll n){  // 0-n ( (ai+b)/c )*i

}
int main(){
    int T; scanf("%d",&T);
    while(T--){
        int a,b,c,n; scanf("%d %d %d %d",&n,&a,&b,&c);
        printf("%lld 0 0\n",(FF(a,b,c,n)%mod+mod)%mod);
    }

}
View Code
#include<bits/stdc++.h>
#define ll long long
const int mod=1e9+7;
const int inv2=(1+mod)/2;
const int inv6=1; // 这个错得
using namespace std;
struct ou{
    int a,b,c,n;
    ll f(ll a, ll b, ll c, ll n) {  // 0-n  (ai+b)/c;
        if (a == 0)
            return (n + 1) * (b / c) % mod;
        if (n == 0) return (b / c);
        if (a >= c || b >= c)
            return (f(a % c, b % c, c, n) + (a / c) * n % mod * (n + 1) % mod * inv2 % mod + (b / c) * (n + 1) % mod) % mod;
        ll m = (a * n + b) / c;
        return (n * m % mod - f(c, c - b - 1, a, m - 1)) % mod;
    }
    ll g(ll a, ll b, ll c, ll n) {  // 0-n  ( (ai+b)/c  )*( (ai+b)/c  )
        if (a == 0) return (b / c) * n % mod * (n + 1) % mod * inv2 % mod;
        if (n == 0) return 0;
        if (a >= c || b >= c) return (g(a % c, b % c, c, n) + (a / c) * n % mod * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod + (b / c) * n % mod * (n + 1) % mod * inv2 % mod) % mod;
        ll m = (a * n + b) / c;
        return (n * (n + 1) % mod * m % mod - f(c, c - b - 1, a, m - 1) - h(c, c - b - 1, a, m - 1)) % mod * inv2 % mod;
    }
    ll h(ll a, ll b, ll c, ll n) {   //  0-n ( (ai+b)/c )*i
        if (a == 0) return (n + 1) * (b / c) % mod * (b / c) % mod;
        if (n == 0) return (b / c) * (b / c) % mod;
        if (a >= c || b >= c)
            return ((a / c) * (a / c) % mod * n % mod * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod +
                    (b / c) * (b / c) % mod * (n + 1) % mod + (a / c) * (b / c) % mod * n % mod * (n + 1) % mod +
                    h(a % c, b % c, c, n) + 2 * (a / c) % mod * g(a % c, b % c, c, n) % mod +
                    2 * (b / c) % mod * f(a % c, b % c, c, n) % mod) % mod;
        ll m = (a * n + b) / c;
        return (n * m % mod * (m + 1) % mod - 2 * g(c, c - b - 1, a, m - 1) - 2 * f(c, c - b - 1, a, m - 1) - f(a, b, c, n)) % mod;
    }
};
int main(){

}
View Code

猜你喜欢

转载自www.cnblogs.com/Andromeda-Galaxy/p/11345253.html