题意:
对于一个数n,有一些这样的一个数对(p,q),满足1<=p<=q<=n,且lcm(p,q)=n。则f(n)等于所有的这样的数对的p和q的和。已知n(以底数和指数的形式给出),求f(n)。
题解:
考虑底数pi,对应指数ai,若p的指数小于ai,则q的指数必等于ai;若p的指数等于ai,则q的指数无所谓。通过枚举p每个底数的指数,可知q有多少种取法(可能会导致p>q,没关系)。加起来就可以。
但是直接枚举p的每一个取值会TLE。显然p的指数小于ai时q的方案数是相同的,所以可以一起算。
到最后除了(n,n)只算了一次外,每个数对都算了两次,所以加上2*n后再除2就是答案。
有些数据不预处理出乎意料地慢,要注意。
//Time:316ms
//Memory:0KB
//Length:1362B
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXN 1010
#define MOD 1000000007
int p[MA