写在开头。。。
不知道一开始怎么想的,打了个很奇葩的表。。。。只是看出素数为2。论不会打表的重要性。。。
你如果打了个正确的表会发现,因为n > 2,
结果都是2 的幂,然后可以猜测:如果n的质因子个数为
,那么
。(说的好轻巧)
所以我们要求
的话,就是求
中每个数的质因子个数之和,然后直接快速幂即可。
至于正解是什么积性函数。写的还不错
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<map>
using namespace std;
typedef long long ll;
const int N = 1e7;
ll prim[N+10];
bool vis[N+10];
int tot ;
void prime(){
vis[1] = 1;
int m = sqrt(N + 0.5);
for(int i = 2;i <= m;++i){
if(!vis[i])
for(int j = i * i;j <= N;j += i) vis[j] = 1;
}
for(int i = 2;i <= N;++i){
if(!vis[i]) prim[++tot] = i;
}
}
ll Qpow(ll a,ll b,ll p){
ll ans = 1;
a %= p;
while(b){
if(b & 1) ans = ans * a % p;
b >>= 1;
a = a * a % p;
}
return ans;
}
int main(){
prime();
int t;
cin>>t;
ll a,b;
while(t --){
cin>>a>>b;
int p = 1;
int sum = 0;
while(p <= tot && prim[p] <= a){
sum += a/prim[p++];
}
// cout<< sum ;continue;
cout<<Qpow(2,sum,b)<<endl;
}
}