码迷,mamicode.com
首页 > 其他好文 > 详细

HeHe HDU-2879【积性函数推导】

时间:2021-01-27 13:59:23      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:class   函数   cpp   text   因此   printf   lin   spl   等价   

题意

定义 \(\text{He[N]}\) 表示满足以下方程的解的个数:

\[X^2\equiv X(\bmod N)(X\in [0,N-1]) \]

并且定义 \(\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^2\equiv X(\bmod p) \]

等价于:

\[X(X-1)=k\times p(k\in Z) \]

因为 \(X\in [0,p-1]\) ,所以 \(X\)\(X-1\) 不可能被 \(p\) 整除,那么只有 \(X(X-1)=0\) ,即必然有 \(0,1\) 两个解。

结论\(2\)\(\text{He[pq]=4}\)\(p,q\) 互质)

证明

对于方程:

\[X^2\equiv X(\bmod pq) \]

等价于:

\[X(X-1)=k\times pq \]

首先,\(X\) 必然有 \(0,1\) 两个解。同时,\(X\) 可能为 \(p\) 或者 \(q\) 的倍数。假设 \(X=n\times p\) ,有:

\[n(np-1)=kq \]

\(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;
}

HeHe HDU-2879【积性函数推导】

标签:class   函数   cpp   text   因此   printf   lin   spl   等价   

原文地址:https://www.cnblogs.com/1024-xzx/p/14332689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!