题意:好难描述不想写了
做法:我比赛的时候是找规律分解到f0做的,估计是常数过大gg了。后来补题的时候发现f0是积性函数,通过数学归纳法可以证fr都是积性函数。然后就预处理一下分解质因数就做完了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll f[31][1000005];
bool vis[1000005];
int prime[1000005];
int tot;
int main()
{
tot=0;
memset(vis, false, sizeof(vis));
for(int i=2;i<=1000000;i++){
if(!vis[i]){
prime[++tot]=i;
for(int j=2;j*i<=1000000;j++)vis[j*i]=true;
}
}
f[0][0]=1;
for(int i=1;i<=30;i++)f[i][0]=2;
for(int j=1;j<=1000000;j++)f[0][j]=1;
for(int j=1;j<=1000000;j++)
for(int i=1;i<=30;i++)f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
int t;
scanf("%d", &t);
for(int tt=1;tt<=t;tt++){
int r, n;
scanf("%d%d", &r, &n);
ll ans=1;
int res=n;
for(int i=1;prime[i]*prime[i]<=res&&i<=tot;i++){
if(res%prime[i]==0){
int tim=0;
while(res%prime[i]==0){
res/=prime[i];
tim++;
}
ans=ans*f[tim][r]%mod;
}
}
if(res!=1)ans=ans*f[1][r]%mod;
printf("%lld\n", ans);
}
}