题目链接

https://cn.vjudge.net/contest/307680#problem/A

In the equation X^2≡X(mod N) where x∈[0,N-1], we define He[N] as the number of solutions.
And furthermore, define HeHe[N]=He[1]*……*He[N]
Now here is the problem, write a program, output HeHe[N] modulo M for a given pair N, M.

Input

First line: an integer t, representing t test cases.
Each test case contains two numbers N (1<=N<=10^7) and M (0<M<=10^9) separated by a space.

Output

For each test case, output one line, including one integer: HeHe[N] mod m.

Sample Input

1
2 3

Sample Output

2

题意:

定义He[N]为 在[0,N−1]范围内有多少个数满足式子x^2≡x (mod N)

求HeHe[N]=He[1]×……×He[N]

 

积性函数定义:

对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。

若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的

常见积性函数:

  • φ(n) -欧拉函数,计算与n互质的正整数之数目
  • μ(n) -莫比乌斯函数,关于非平方数的质因子数目
  • gcd(n,k) -最大公因子,当k固定的情况
  • d(n) -n的正因子数目
  • σ(n) -n的所有正因子之和
  • σk(n) - 因子函数,n的所有正因子的k次幂之和,当中k可为任何复数。
  • Idk(n) -幂函数,对于任何复数、实数k,定义为Idk(n) = n^k (完全积性)
  • λ(n) -刘维尔函数,关于能整除n的质因子的数目
  • γ(n),定义为γ(n)=(-1)^ω(n),在此加性函数ω(n)是不同能整除n的质数的数目
     

结论:

1) 函数He[]是积性函数,对于p,q两个数互质有:He[pq]=He[p]×He[q]

2) 如果p是素数那么He[p]=2且He[p^k]=2

证明:见大佬博客https://blog.csdn.net/codeswarrior/article/details/81433946

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5;
bool p[N];
int prime[N],cnt=0;
void init(){
	p[0]=p[1]=true;
	for(int i=2;i<N;i++){
		if(!p[i]) prime[cnt++]=i;
		for(int j=0;j<cnt&&(ll)i*prime[j]<N;j++){
			p[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
}
ll ksm(ll a,ll b,ll mod){
	ll s=1;
	while(b){
		if(b&1){
			a%=mod;
			s%=mod;
			s*=a;
		}
		a%=mod;
		a*=a;
		b>>=1;
	}
	return s%mod;
}
int main(){
	init();
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m;
		scanf("%d%d",&n,&m);
        ll ans=0;
		for(int i=0;i<cnt&&prime[i]<=n;i++){
			ans+=n/prime[i];
		}
		ans=ksm(2,ans,m);
		printf("%lld\n",ans);
	}	
	return 0;
}