题意简述
T组数据。每次给定n,求
n<=10^7,T<=5000。 (用T根号n的算法就能过了)
思路框架
把gcd换掉,然后用[SDOI2008]仪仗队(洛谷 bzoj)的做法,每次根号(n)求出来
具体思路
把换掉,式子变成
提前,变成
后面那个式子化一下,变成枚举的倍数:
然后,后面的式子就变成了仪仗队那题的式子了。也就是,我们要求:
。由于前面要整除分块,带一个根号,所以这个地方就要用一个的算法求。
仪仗队那题的O(1)做法
由于是对称的,所以我们考虑把它变成这样:
。
我们设的和。(即:求的前缀和)
那么该式等于。
得解
回到原问题。上回说到,式子变成了。
套用仪仗队那题的式子,变成:
后面的珂以整除分块做。总体复杂度就是。
WARNING
只有phi的前缀和以及答案需要开long long ,其它int就够了。防止MLE。
代码
1 |
|