Codeforces 757 E Bash Plays with Functions

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 ≤ 1061 ≤ 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

Input
5
0 30
1 25
3 65
2 5
4 48
Output
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\n",ans[i]);
	return 0;
} 

  




posted @ 2018-02-15 13:06  蒟蒻JHY  阅读(209)  评论(0编辑  收藏  举报