1.
2.大树的用Python做
3.
4. 思维题
5.K倍区间
一个经典的前缀和题目
在读入 (A_i) 的时候直接存入前 (i) 项和。
求区间 ([i,j]) 的和的时候,直接用前 (j) 项和 (S_j) 减去前 (i) 项和 (S_i) 就得到了,然后对其模 (K),判断是否为 (0) 即可。直接做会超时。
优化:
如果 ((S_i - S_j) %k = 0) ,那么 (S_i%k) 和 (S_j%k) 都等于 (0) 。
问题就转化为了,枚举终点坐标 (x) ,求有多少个数模(k)的余数是(S_x%k)。即查找某一个数出现了多少次。
开一个 (cnt) 数组, (cnt[x]) 表示,余数为 (x) 的数的个数。
即求的就是 (cnt[S_x%k]) ,每次算完就让 (cnt[S_x%k]++) 。
用一个数组去保存test数组中相同模的个数,所有的相同模的个数分别经过Cn2的计算后再加和,最后再加上本来就是k倍区间的数列个数即为要求结果 开一个 (cnt) 数组, (cnt[x]) 表示,余数为 (x) 的数的个数。即求的就是 (cnt[S_x%k]) ,每次算完就让 (cnt[S_x%k]++) 。