题目链接:https://cn.vjudge.net/problem/HDU-2879
题意: X^2≡X(mod N) where x∈[0,N-1]的数量为 He[N] HeHe[N]=He[1]*……*He[N] 求HeHe[n]%m
题解:打表可以看出,He[i] = 2^质因子数目,之前先求出了欧拉函数做的,但是超时,所以,要用线性筛来先把素数筛出来,通过枚举素因子来做就可以了
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
typedef long long ll;
int prime[N], len, ok[N];
int n,mod;
void init() {
for(int i = 2; i <= 10000000; i++) {
if(!ok[i]) prime[len++] = i;
for(int j = 0; j < len && prime[j] * i <= 10000000; j++) {
ok[prime[j] * i] = 1;
if(i % prime[j] == 0) break;
}
}
}
ll ksm(ll x,ll y) {
ll res = 1;
while(y) {
if(y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
int main() {
init();
int T;
ll res;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &mod);
res = 0;
for(int i = 0; i < len && prime[i] <= n; i++)
res += n / prime[i];
printf("%lld\n", ksm(2, res));
}
return 0;
}