题目
记 ,显然有
。
考虑如何计算 :
- 可以证明:
-
-
从
到
,有完整的
段
和剩下的一段
。
单组测试时间复杂度 。
AC代码如下
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int l,r,p,q;
int pre(int n){
return (n*(n+1))/2;//计算1+2+...+n
}
int f(int x){
return x/q*pre(p-1)+pre(min(x%q,p-1));x/q个周期,每个周期和为pre(p-1),剩下部分和为0+1+...+min(x%q,p-1)。
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){
cin>>l>>r>>p>>q;
cout<<f(r)-f(l-1)<<endl;
}
return 0;
}
注:
剩下部分的和的计算:因为每段长度是q,且大于p-1的部分是0。