题目链接:https://nanti.jisuanke.com/t/A2147
题目大意:有一个长度为n的序列a,定义mul(l, r)为区间[l, r]中a[i]的乘积,fac(l, r)为mul(l, r)不同素数因子的个数。求所有区间fac的和。
题解:先用样例二打表找规律,发现答案其实是所有区间中不同素数因子个数的和。
考察序列a中每个数对答案的贡献,不难发现,贡献为(i - vis[a[i]]) * (n - i + 1)。其中i表示第i个数(下标从1开始),vis[a[i]]表示a[i]上一次出现的位置。
算贡献的式子可以这么理解:因为要算不同的素数的个数,如果这位置上的数是a[i],它在之前出现过了,上一次出现的位置是vis[a[i]],那么,在vis[a[i]]之前,现在遍历到的这个数a[i]是没有贡献的。 所以现在这个位置上的数a[i]就贡献了(i - vis[a[i]]) * (n - i + 1)。
预处理出所需要的素数,遍历一遍序列a,累加答案即可。
1 #include
2 #include
3 #include