T1:算术计算

T 组数据,每组数据给出 n,a,p,求 i=1niaip 取模的值。

部分分

直接暴力求和可以拿到 15
另外 10% 的数据 a=1,不难通过数据计算得到答案为 n(n+1)2
另外 15% 的数据满足 1n106,所有问题 a,p 都相同,可以先把 n106 的结果全部计算出来,存到数组里面,询问的时候直接查表

数学方法

不难通过计算得到最后的答案为 a(1an)(1a)2nan+11a

由于分母部分出现了 1a,因此当 gcd(p,1a)=1 的时候存在 1a 的逆元,此时可以使用公式求解
可以得到 p 是一个质数的 30

分治法

先考虑用递归分治求 an,令 k=n2q=[nmod2=1],即:当 n 为偶数时q=0n 为奇数时 q=1,则 an=ak×ak×aq 可以在 O(logn) 时间内求出 an

接下来考虑 g(n)=a+a2++an,同样的,使用分治先计算得到 g(k) 的值,发现 g(k)g(n) 之间缺了 ak+1+ak+2+ak+3++a2k+qan,前面 k 项的和可以表示为 akg(k),因此得到 g(n)=(1+ak)g(k)+qan

有了上面的方法之后,计算 a+2a2++nan 就显得轻车熟路了。先计算 f(k),缺的项为 (k+1)ak+1+(k+2)ak+2++2ka2k+qnan,前面 k 项可以提公因式 ak,再展开前面的 k+i,得到 (k+1)ak+1+(k+2)ak+2++2ka2k=ak(ka+ka2++kak+a+2a2++kak)=kakg(k)+akf(k),因此 f(n)=f(k)+kakg(k)+akf(k)+qnan