这一题把公式拆开是可以找到规律的。我开始找出了固定i-th exponential-power,得到一个很冗长的公式,再对i求和。然而大数据并不能算出来。。
另一个角度是针对每个A[i],观察其贡献的值、
对于数组[a,b,c,d,e],a作为sub array的第一个元素总计5次,b作为sub array的第一个元素总计4次,c作为sub array的第一个元素总计3次,对应的贡献是A[i]*(1^1+1^2+...+1^K)
b作为sub array的第2个元素总计4次,c作为sub array的第一个元素总计3次,…对应的贡献是A[i]*(2^1+2^2+...+2^K)
由此可以得出,A[i]的贡献是
A[i]*(N-i+1)*(geo_sum(i,K)+geo_sum(2,K)+...+geo_sum(i,K)), geo_sum(x,K)=x+x^2+x^3+...+x^K
最终结果对所有的A[i]求和即可。
等比数列a1,a2,..an, an=a1*q^(n-1)求和Sn=(a1*(1-q^n))/(1-q)=x(x^K-1)/(x-1)。除法不能直接mod,需要先算出逆序数,i.e., if P is prime, (1/a)%P=a^(P-2)。
另外取模的时候有很多坑。。
1. 如果用(x^(K+1)%mod-x)*inv[x-1]%mod,x^(K+1)%mod-x是有可能<0的,所以要判断中间结果是否<0,如果<0就先+mod再乘后面的数。
2. 对于a*b*c % mod这样的连乘,一定要在每一个相乘的项后面取mod,否则很可能中途就overflow了。比如我开始写成了((a%mod)*(b%mod)*(c%mod))%mod就一直incorrect,应该是(((a*b)%mod)*c)%mod。
另外sum of geo_sum是随着i递增的,不需要对于每个A[i]都重新算,直接累加A[i]对应的贡献值即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include