FZU 1759 欧拉函数 降幂公式

Posted 半根毛线code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU 1759 欧拉函数 降幂公式相关的知识,希望对你有一定的参考价值。

 

Description

 

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).

Input

There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.

 

Output

For each testcase, output an integer, denotes the result of A^B mod C.

 

Sample Input

3 2 4
2 10 1000

Sample Output

1
24

Hint

 

Source

FZU 2009 Summer Training IV--Number Theory
 
题意:A^B mod C
题解:

降幂公式 phi() 为欧拉函数

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define ll __int64
 5 #define mod 10000000007
 6 using namespace std;
 7 char a[1000006];
 8 ll x,z;
 9 ll quickpow(ll x,ll y,ll z)
10 {
11     ll ans=1;
12     while(y)
13     {
14         if(y&1)
15             ans=ans*x%z;
16         x=x*x%z;
17         y>>=1;
18     }
19     return ans;
20 }
21 ll phi(ll n)
22 {
23     ll i,rea=n;
24     for(i=2;i*i<=n;i++)
25     {
26         if(n%i==0)
27         {
28             rea=rea-rea/i;
29             while(n%i==0)
30                 n/=i;
31          }
32     }
33     if(n>1)
34         rea=rea-rea/n;
35     return rea;
36 }
37 int main()
38 {
39     while(scanf("%I64d %s %I64d",&x,a,&z)!=EOF)
40     {
41         ll len=strlen(a);
42         ll p=phi(z);
43         ll ans=0;
44         for(ll i=0;i<len;i++)
45             ans=(ans*10+a[i]-\'0\')%p;
46         ans+=p;
47         printf("%I64d\\n",quickpow(x,ans,z));
48     }
49     return 0;
50 }

 

以上是关于FZU 1759 欧拉函数 降幂公式的主要内容,如果未能解决你的问题,请参考以下文章

FZU-1759 Super A^B mod C---欧拉降幂&指数循环节

指数循环节&欧拉降幂

HDU4704(SummerTrainingDay04-A 欧拉降幂公式)

广义欧拉降幂

浅谈 欧拉降幂

2019ICPC网赛南京站B题 super_log(欧拉降幂