题目
题意:He[N]的值为 方程(X^2)%N=X解的个数. HeHe[N]是He[N]的前缀积.
多组样例n,m:求HeHe[n]%m的值.
题解:像这种只给个公式的,一般是打表或者积性函数。打表没看出来规律。
证明He[n]是积性函数: 分步证明:
1.p是质数:He[p]=2。(x=0,x=1)
2.gcd(a,b)=1,He[a*b]=He[a]He[b];
证出除0,1以外的两组解习,证明每一组解系分别只有一个满足题意,x1,x2.
证明x1!=x2;
3.He[p^k]=2;(p为质数时);
He[300]=He[2^2 * 3 * 5^2 ]=He[2^2] he[3] *He[5^2]= 2 * 2 * 2;
p有x个质因子则He[p]=2^x;
计算He[p] * He[p-1] * He[p-1] * … * He[1]的话看代码。。很简单的
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#define en '\n'
using namespace std;
typedef long long ll;
const int N=1e7+5;
int prime[N/7],is[N],tot;
void getprime()
{
for(int i=2;i<=N-5;++i)
{
if(!is[i]) prime[++tot]=i;
for(int j=1;j<=tot&&(ll)i*prime[j]<=N-5;++j)
{
is[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
ll quick_pow(ll c,ll p,ll mod)
{
ll res=1;
while(p)
{
if(p&1) res=res*c%mod;
c=c*c%mod;
p>>=1;
}
return res;
}
int main()
{
getprime();
int T;scanf("%d",&T);
while(T--)
{
int n;ll mod;scanf("%d%lld",&n,&mod);
ll ans=0;
for(int i=1;prime[i]<=n&&i<=tot;++i)
ans+=n/prime[i];//!!!
printf("%lld\n",quick_pow(2,ans,mod));
}
}