CF757E
CF757E Bash Plays with Functions
\(f_r(n):\)
在\(r=0\),\(p*q=n\)且\(gcd(p,q)=1\)的有序对\((p,q)\)个数
在\(r\ge1\),\(f_r(n)=\large\sum\limits_{u*v=n}\frac{f_{r-1}(u)+f_{r-1}(v)}2\)
\(r=0\)
因为\(a*b=n\),\(gcd(a,b)=1\),\(a\)和\(b\)平分了\(n\)的所有质因子
把\(\large p_i^{k_i}\)分成两份,方案数为\(2^{w(n)}\),\(w(n)\)为\(n\)的质因子个数,\(f_0(n)=2^{w(n)}\)
显然\(f_0\)为积性函数
\(r\ge1\)
变一个式子\(\large f_r(n)=\sum\limits_{d|n}\frac{f_{r-1}(d)+f_{r-1}(\frac nd)}2\),\(d\)和\(\large\frac nd\)对称的
把分母\(2\)打掉,\(f_r(n)=\large\sum\limits_{d|n}f_{r-1}(d)\)
这是个狄利克雷卷积式子,\(f_r=f_{r-1}×1\) \(f_r\)是积性函数
\(f_r(n)=\prod f_r(p^{k_i})\)
const int N = 1e6 + 5,K = 20,mod = 1e9 + 7;
int dp[N][K],sum[K] = {1},low[N];
void getprime(){
for(int i = 2;i < N;++i)
if(!low[i])
for(int j = i;j < N;j += i) low[j] = i;
}
void init(){
getprime();
for(int i = 0;i < N;++i) dp[i][0] = 1;
for(int i = 1;i < K;++i)
dp[0][i] = 2,sum[i] = sum[i-1] + dp[0][i];
for(int i = 1;i < N;++i)
for(int j = 1;j < K;++j){
dp[i][j] = sum[j]; sum[j] = (sum[j - 1] + dp[i][j]) % mod;
}
}
ll ans = 1;
int main(){
init(); int Q,r,n; Q = read();
while(Q--){
r = read(); n = read();
ans = 1;int cnt,p;
while(n != 1){
cnt = 0;p = low[n];
while(!(n % p)) ++cnt, n /= p;
ans = ans * dp[r][cnt] % mod;
}
printf("%d",ans); putchar('\n');
}
}