Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include<bitset>
- using namespace std;
- ifstream f("nr_div_huge.in");
- ofstream g("nr_div_huge.out");
- int q,n,k,p,t;
- long long m=1000000007;
- void ciur(int p,int v[]) ///nr prime<100000
- {bitset<31700>a=0;
- for(int d=2;d<=p;d++)
- if(!a[d])
- {
- v[++t]=d;
- for(int i=d*d;i<=p;i=i+d) a[i]=1;
- }
- }
- long long nrdiv(int x,int v[])
- {
- long long sol=1,z=1,w=0;
- while(v[z]*v[z]<=x)
- {
- if(x%v[z]==0)
- {
- while(x%v[z]==0) w++,x/=v[z];
- if(z==1) w--;
- sol=sol*(w+1);
- w=0;
- }
- z++;
- }
- if(x>1) sol=sol*2;
- return sol;
- }
- long long nrdivn(int x, int n,int v[])
- {
- long long sol=1,z=1,w=0;
- while(v[z]*v[z]<=x)
- {
- if(x%v[z]==0)
- {
- while(x%v[z]==0) w++,x/=v[z];
- w=w*n;
- if(z==1) w--;
- sol=sol*(w+1)%m;//********mod
- w=0;
- }
- z++;
- }
- if(x>1) sol=sol*(n+1)%m; /// *************mod
- return sol;
- }
- long long ans(int n, int k,int v[])
- {
- long long t1=nrdivn(k,n+1,v);
- long long t2=nrdiv(k+1,v);
- return t1*t2%m; /// *********mod
- }
- int main()
- {
- int v[3410];
- p=31700; /// 3410 nr prime
- ciur(p,v);
- f>>q;
- for(int i=1;i<=q;++i)
- {
- f>>n>>k;
- g<<ans(n,k,v)<<'\n';
- }
- g.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement