2 ^ x mod n = 1 HDU - 1395] [Euler's theorem

Euler's theorem:

If \ (a, p \) prime, then

\[a^{\varphi(p)}=1 mod\; p \]

But note that satisfy the equation numbers \ (\ varphi (p) \ ) is not necessarily minimal.

Code:

#include <bits/stdc++.h>
using namespace std;
int getphi(int n)
{
    int res=n;
    for(int i=2;1LL*i*i<=n;i++)
    {
        if(n%i==0)
        {
            res-=res/i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1)
        res-=res/n;
    return res;
}
int power(int a,int b,int p)
{
    int res=1;
    while(b)
    {
        if(b&1)
            res=a*res%p;
        a=a*a%p;
        b>>=1;
    }
    return res%p;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if((n&1)&&n>1)
        {
            int ans=getphi(n);
            for(int i=1;i<=ans;i++)
            {
                if(power(2,i,n)==1)
                {
                    ans=i;
                    break;
                }
            }
            printf("2^%d mod %d = 1\n",ans,n);
        }
        else
            printf("2^? mod %d = 1\n",n);
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/1024-xzx/p/12576130.html