QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: KiharaTouma

Posted at: 2026-02-05 18:03:08

Last updated: 2026-02-05 18:04:20

Back to Problem

New Editorial for Problem #14719

我们有结论!

  • $[x\bmod m < y\bmod m] = \lfloor\dfrac{x}{m}\rfloor - \lfloor\dfrac{y}{m}\rfloor - \lfloor\dfrac{x-y}{m}\rfloor$。

拆式子,然后三部分分别万欧就做完了。

//qoj14719
#include <bits/stdc++.h>
using namespace std;

/*
(ax + b) mod m < (cx + d) mod m
[xmodm<ymodm]=x/m - y/m - (x-y)/m
*/
typedef long long ll;

struct node{
    ll cntR, cntU, sum;
    node(){
        cntR = cntU = sum = 0;
    }
    node operator + (const node &b) const {
        node c;
        c.cntR = cntR + b.cntR;
        c.cntU = cntU + b.cntU;
        c.sum = sum + b.sum + cntU * b.cntR;
        return c;
    }
} ans, U, R;
node qp(node x, int y){
    node ans;
    while(y){
        if(y & 1){
            ans = ans + x;
        }
        x = x + x;
        y >>= 1;
    }
    return ans;
}

node solve(ll p, ll q, ll r, ll n, node U, node R){
    if(!n){
        return node();
    }
    if(r >= q){
        return qp(U, r/q) + solve(p, q, r%q, n, U, R);
    }
    if(p >= q){
        return solve(p%q, q, r, n, U, qp(U,p/q)+R);
    }
    ll m = ((long double)1.0 * n * p + r) / q;
    if(!m){
        return qp(R, n);
    }
    ll cnt = n - (ll)((long double)1.0 * q * m - r - 1) / p;
    return qp(R, (q-r-1)/p) + U + solve(q, p, (q-r-1)%p, m-1, R, U) + qp(R, cnt);
}

ll calc(ll p, ll q, ll n, ll P){
    ll rs = n * (q / P);
    q -= P * (q / P);
    if(q < 0){
        rs -= n;
        q += P;
    }
    return rs + solve(p, P, q, n, U, R).sum;
}

int T, a, b, c, d, n, m;
int main(){
    U.cntU = 1;
    R.cntR = 1;
    scanf("%d", &T);
    while(T --){
        scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &n, &m);
        b -= a;
        d -= c;
        ll ans = calc(a, b, n, m) - calc(c, d, n, m);
        if(a >= c){
            ans -= calc(a-c, b-d, n, m);
        } else {
            ans += n + calc(c - a, d - b - 1, n, m);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Comments

No comments yet.