[CSP-S模拟测试]:简单计算(数学)
题目传送门(内部题104)
输入格式
第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数。
接下来$T$组数据,每组数据一行两个正整数$p,q$。
输出格式
对每组数据输出一行一个整数表示答案。
样例
样例输入:
5
1 1
3 5
5 3
2 4
4 2
样例输出:
1
9
7
6
4
数据范围与提示
对于$50\%$的数据,$1\leqslant p,q\leqslant 10,000$。
对于$100\%$的数据,$1\leqslant T\leqslant 1,000,1\leqslant p,q\leqslant 1000,000,000=1,000^3$。
题解
$$\begin{array}{ll} 2\sum\limits_{i=0}^p\left\lfloor\frac{iq}{p}\right\rfloor &=& \sum\limits_{i=0}^p\left\lfloor\frac{iq}{p}\right\rfloor+\left\lfloor\frac{(p-i)q}{p}\right\rfloor \\ &=& (p+1)\times q-\sum\limits_{i=0}^p[(p|qi)?0:1] \\ &=& (p+1)\times q-p+gcd(p,q)\end{array}$$
时间复杂度:$\Theta(T\log\max(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\n",((p+1)*q-p+__gcd(p,q))>>1);
}
return 0;
}
rp++