Discription
Bash got tired on his journey to become the greatest Pokemon master. So he decides to take a break and play with functions.
Bash defines a function f0(n), which denotes the number of ways of factoring n into two factors p and q such that gcd(p, q) = 1. In other words, f0(n) is the number of ordered pairs of positive integers (p, q) such that p·q = n and gcd(p, q) = 1.
But Bash felt that it was too easy to calculate this function. So he defined a series of functions, where fr + 1 is defined as:
Where (u, v) is any ordered pair of positive integers, they need not to be co-prime.
Now Bash wants to know the value of fr(n) for different r and n. Since the value could be huge, he would like to know the value modulo 109 + 7. Help him!
Input
The first line contains an integer q (1 ≤ q ≤ 106) — the number of values Bash wants to know.
Each of the next q lines contain two integers r and n (0 ≤ r ≤ 106, 1 ≤ n ≤ 106), which denote Bash wants to know the value fr(n).
Output
Print q integers. For each pair of r and n given, print fr(n) modulo 109 + 7 on a separate line.
Example
5
0 30
1 25
3 65
2 5
4 48
8
5
25
4
630
题解见代码注释。
就是个积性函数的题
/* 首先可以发现f0(x)=2^k ,其中k为x的质因子数。 然后对于r>=1, fr(x)=Σfr-1(d) 其中d|x。 又∵f0是积性函数,fr=fr-1卷1,所以fr也是积性函数。 所以fr(x)=πfr(pi^ai) 还可以发现的是只要ai一样的话fr(pi^ai)是一样的, 所以fr(pi^ai)只与质因子的次数有关。 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<vector> #include<cmath> #include<algorithm> #define ll long long #define maxn 1000005 #define pb push_back using namespace std; const ll ha=1000000007; struct req{ int num,ci; }; vector<req> g[maxn]; int f[maxn][23],T,mx; int R,N,ans[maxn]; inline int add(int x,int y){ x+=y; if(x>=ha) return x-ha; else return x; } inline void dp(){ f[0][0]=1; for(int i=1;i<=20;i++){ f[0][i]=2; } for(int i=1;i<=mx;i++){ f[i][0]=f[i-1][0]; for(int j=1;j<=20;j++) f[i][j]=add(f[i][j-1],f[i-1][j]); } } bool v[maxn]; inline void init(){ fill(ans+1,ans+T+1,1); int now,c,sz; req x; for(int i=2;i<=1000000;i++) if(!v[i]){ for(int j=i;j<=1000000;j+=i){ v[j]=1; sz=g[j].size(); if(sz){ now=j,c=0; while(!(now%i)) now/=i,c++; for(int k=0;k<sz;k++){ x=g[j][k]; ans[x.num]=ans[x.num]*(ll)f[x.ci][c]%ha; } } } } } int main(){ scanf("%d",&T); for(int i=1;i<=T;i++){ scanf("%d%d",&R,&N); mx=max(mx,R); g[N].pb((req){i,R}); } dp(); init(); for(int i=1;i<=T;i++) printf("%d ",ans[i]); return 0; }