我们有结论!
- $[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;
}