long long 爆的好啊!!
题目链接
我们把要求的式子展开
= f(x,1)⋅f(x,2)⋅…⋅f(x,n)g(1,p1)⋅g(1,p2)⋅…⋅g(1,pn)g(2,p1)⋅g(2,p2)⋅…⋅g(2,pn)g(3,p1)⋅g(3,p2)⋅…⋅g(3,pn)⋮g(n,p1)⋅g(n,p2)⋅…⋅g(n,pn)
然后每次计算一列,由于p是质数,当且仅当n=k⋅pj时g(n,p)=j,否则g(n,p)=1。由于同一列中p都是相同的,所以只要计算指数之和就行了。直接分析代码:
n / tmp
的结果就是对于当前的 tmp,1,2,3,…,n中有几个可以整除 tmp。
对于1,2,…,n每个数字都被筛过g(n,p)次,所以累加每一次的n / tmp
就是指数之和了。注意tmp *= it
可能会爆 long long 所以乘之前要先检查一下(做的时候被卡了,直接自闭)。
完整代码: