[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\%$的数据,$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++

原文地址:https://www.cnblogs.com/wzc521/p/11771048.html