http://acm.hdu.edu.cn/showproblem.php?pid=1395

枚举x复杂度可以处理成O(n),由于我是个sb,所以给弄成O(nlogn)了。

这里用的方法基于欧拉定理。欧拉定理表明,若n,a为正整数,且n,a互质,(a,n) = 1,则a^φ(n) ≡ 1 (mod n)。

我们处理的当然是(2,n)=1的情况,枚举欧拉函数的因子即可

View Code
#include <stdio.h>
__int64 qpow(int a,__int64 b,int r)
{
    __int64 ans=1,buff=a;
    while(b)
    {
        if(b&1)ans=(ans*buff)%r;
        buff=(buff*buff)%r;
        b>>=1;
    }
    return ans;
}
__int64 Eular(__int64 n)
{
    __int64 ret=n;
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
        {
            ret-=ret/i;
            while(n%i==0)n/=i;
            if(n==1)break;
        }
    if(n!=1)ret-=ret/n;
    return ret;
}

int main()
{
    __int64 n ;
    while(~scanf("%I64d",&n))
    {
        if((n&1)==0 || n==1)
            printf("2^? mod %I64d = 1\n",n) ;
        else
        {
            __int64 temp=Eular(n) ;
            for(int i=2;;i++)
                if(temp%i==0 && qpow(2,i,n)==1)
                {
                    printf("2^%d mod %I64d = 1\n",i,n) ;
                    break ;
                }
        }
    }
    return 0 ;
}