FZU 1759 欧拉函数的应用 快速幂

A ^{x}(mod m)=A^(x%\phi (m)+\phi (m)) (mod m);

当x>=\phi (m)时等式成立;

分两种情况:

x>=\phi (m)用公式化简

如果小于直接快速幂求解

代码:

#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;
const ll N=1e6+10;
char ss[N];
ll Phi(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;
}
ll Pow(ll base,ll n,ll mod)
{
   base=base%mod;
   ll result=1;
   while(n>0)
   {
      if(n&1)result=result*base%mod;
      base=base*base%mod;
      n>>=1;
   }
   return result;
}
void solve(ll A,char ss[],ll C)
{
    ll phi=Phi(C),len=strlen(ss);
    ll result=0;
    for(ll i=0;i<len;i++)
    {
       result=result*10+ss[i]-'0';
       if(result>=phi)break;
	}
	if(result>=phi)
	{
	   result=0;
	   for(ll i=0;i<len;i++)
	   {
	      result=result*10+ss[i]-'0';
	      result=result%phi;
	   }
	   result=result+phi;
	   printf("%lld\n",Pow(A,result,C));
	}
	else printf("%lld\n",Pow(A,result,C));
}
int main()
{
   ll A,C;
   while(~scanf("%I64d",&A))
   {
	  scanf("%s",ss);
      scanf("%I64d",&C);
      solve(A,ss,C);
   } 
} 

猜你喜欢

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