hdu 1395 欧拉函数 快速幂

#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define PI acos(-1)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
ll pow(ll a,ll n,ll mod)
{
   a=a%mod;
   ll result=1;
   while(n>0)
   {
      if(n&1)result=result*a%mod;
      a=a*a%mod;
      n=n>>1;
   }
   return result%mod;
}
ll getphi(ll n)
{
   ll t=n;
   for(ll i=2;i*i<=n;i++)
   {
      if(n%i==0)
      {
         t=t-t/i;
         while(n%i==0)n=n/i;  
      }
   }
   if(n!=1)t=t-t/n;
   return t;
}
void solve(ll n,ll mod)
{
   for(ll i=1;i<=n;i++)
   {
      if(pow(2,i,mod)==1)
      {
         printf("2^%lld mod %lld = 1\n",i,mod);
         break;
      }
   }
}
int main()
{
    ll n;
    while(~scanf("%lld",&n))
    {
       if(n==1||n%2==0)
       {
          printf("2^? mod %lld = 1\n",n);
          continue;
       }
       ll phi=getphi(n);
       solve(phi,n);
    }
} 

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/82115044
今日推荐