ACM-ICPC 2018 沈阳赛区网络预赛 G

很明显,题目给出的an=n*n+n我们分别有求和公式:

1+2+…+n=(n+1)*n/2

1^2+2^2+…+n^2=n*(n+1)*(2*n+1)/6

很显然,题目给出的m,最多存在8个不同的质因数

那么结合容斥定理,我们最多进行255次求和公式运算,便可以找出结果。

那么,难点有二:

其一:如何找出所有质因数?

由于m<1e8,所有最多存在一个大于1e4的质因数,所以我们只需要先处理掉所有小于1e4的数,如果此时m中还有别的因数,那么这个数字一定是大于1e4的质因数,所以,我们可以以1e4的复杂度,找出每个数的质因数。

 

其二:如何使用容斥定理:

容斥定理,我们可以通俗的解释:首先把所有项都加起来,那么多了不需要的质数项,所以我们又一次性,把所有质因数项减去了,但有的项数被减去了两次,比如:6被2和3同时减去了,所以我们又把质数项两两组合加回来……。如此反复,就可以得到正确结果。

演示一下计算过程:

对于因数k,总项数n,那么这个质因数一共有m=n/k项

k^2+(2*k)^2+…+(k*m)^2=k^2*(1^2+2^2+…+m^2)=k^2* m*(m+1)*(2*m+1)/6

k+(2*k)+…+(k*m)=k*(m+1)*m/2

将上下两式相加得到结果

其中因数k可以是质因数,也可以是质因数相乘。

posted @ 2018-09-11 21:29  诚信肥宅  阅读(106)  评论(0编辑  收藏  举报