题目传送门(内部题104)
输入格式
第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数。
接下来$T$组数据,每组数据一行两个正整数$p,q$。
输出格式
对每组数据输出一行一个整数表示答案。
样例
样例输入:
5
1 1
3 5
5 3
2 4
4 2
样例输出:
1
9
7
6
4
数据范围与提示
对于$50\%$的数据,$1leqslant p,qleqslant 10,000$。
对于$100\%$的数据,$1leqslant Tleqslant 1,000,1leqslant p,qleqslant 1000,000,000=1,000^3$。
题解
$$egin{array}{ll} 2sumlimits_{i=0}^pleftlfloorfrac{iq}{p} ight floor &=& sumlimits_{i=0}^pleftlfloorfrac{iq}{p} ight floor+leftlfloorfrac{(p-i)q}{p} ight floor \ &=& (p+1) imes q-sumlimits_{i=0}^p[(p|qi)?0:1] \ &=& (p+1) imes q-p+gcd(p,q)end{array}$$
时间复杂度:$Theta(Tlogmax(p,q))$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
long long p,q;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&p,&q);
printf("%lld
",((p+1)*q-p+__gcd(p,q))>>1);
}
return 0;
}
rp++