标签:class 函数 cpp text 因此 printf lin spl 等价
定义 \(\text{He[N]}\) 表示满足以下方程的解的个数:
并且定义 \(\text{HeHe[N]}=\text{He[1]}\times \cdots \times \text{He[N]}\),对于给定的 \(N,M(1\leq N \leq 10^7,0<M\leq 10^9)\) ,求出 \(\text{He[N]} \bmod M\) 的值。
其实打表也可以做,但自己没有看出规律来。只好采用另一种方法:积性函数。
结论\(1\):函数 \(\text{He[x]}\) 是积性函数,且 \(\text{He[p]=2}(p\in Prime)\)
证明:
对于方程:
等价于:
因为 \(X\in [0,p-1]\) ,所以 \(X\) 和 \(X-1\) 不可能被 \(p\) 整除,那么只有 \(X(X-1)=0\) ,即必然有 \(0,1\) 两个解。
结论\(2\):\(\text{He[pq]=4}\) (\(p,q\) 互质)
证明:
对于方程:
等价于:
首先,\(X\) 必然有 \(0,1\) 两个解。同时,\(X\) 可能为 \(p\) 或者 \(q\) 的倍数。假设 \(X=n\times p\) ,有:
即 \(q|n(np-1)\)。因为 \(X=np\in[0,pq-1]\) ,所以 \(n<q\) 。因此,\(q|(np-1)\) ,即 \(np\equiv 1(\bmod q)\) 。转化为线性方程 \(np+kq=1\) ,可知必然存在解。因为线性方程组的解 \(x=x_0+q·t\),所以存在一个解。当 \(q|X\) 时,同理,故存在 \(4\) 个解。
因此,对于 \(\text{He[x]}\) ,只要求出其中含有的不同质因子个数 \(k\) ,有 \(\text{He[x]}=2^k\)。对于 \(\text{HeHe[x]}\) ,相当于求阶乘,只要 \(\frac{N}{p_i}\) 就可以知道 \([1,N]\) 中有多少个数含有质因子 \(p_i\),依次累加即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5;
int prime[N],cnt;
bool vis[N];
void init()
{
int maxn=1e7;
for(int i=2;i<=maxn;i++)
{
if(!vis[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
ll power(ll a,ll b,ll mod)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
int t,n,m;
scanf("%d",&t);
init();
while(t--)
{
scanf("%d%d",&n,&m);
ll ans=0;
for(int i=1;i<=cnt&&prime[i]<=n;i++)
ans+=n/prime[i];
ans=power(2,ans,m);
printf("%lld\n",ans);
}
return 0;
}
标签:class 函数 cpp text 因此 printf lin spl 等价
原文地址:https://www.cnblogs.com/1024-xzx/p/14332689.html