HDU 1395 2^x mod n = 1

 

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 ;

}

 

你可能感兴趣的:(HDU)