hdu 2837 Calculation

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2837

额,这两天做上了数论,搞了一个上午终于AC了,不过还是看了别人的代码。。

就是利用一个公式A^B %C  = A^( B%phi[C]  + phi[C]) %C    (B>=phi[C])

大致思路还算清晰,就是要注意中间的细节。

回头再看看吧~~

View Code
 1 # include<stdio.h>

 2 # include<string.h>

 3 # include<stdlib.h>

 4 __int64 eular(__int64 num)

 5 {

 6     __int64 ret=1;

 7     for(int i=2;i*i<=num;i++)

 8     {

 9         if(num%i==0)

10         {

11             num/=i;ret*=i-1;

12             while(num%i==0) {num/=i;ret*=i;}

13         }

14     }

15     return num>1? ret*(num-1):ret;

16 }

17 __int64 mod(__int64 A,__int64 B,__int64 C) //A^B%C

18 {

19     __int64 ans,res=1;

20     int i;

21     ans=1;

22     for(i=1;i<=B && res<=C;i++) res=res*A; 

23     while(B)

24     {

25         if(B%2) ans=ans*A%C;

26         A=A*A%C;

27         B/=2;

28     }

29     if(res>=C) return ans+C;

30     return ans;

31 }

32 

33 ///// A^B %C = A^( B % Phi[C] + Phi[C]) % C       (B >= Phi[C])

34 __int64 dfs(__int64 n,__int64 m) //f[n]%m

35 {

36     __int64 ans;

37     ans=eular(m);

38     if(n==0) return 1%m;

39     return mod(n%10,dfs(n/10,eular(m)),m);

40 }

41 

42 int main()

43 {

44     int ncase;

45     __int64 num,n,m;

46     scanf("%d",&ncase);

47     while(ncase--)

48     {

49         scanf("%I64d%I64d",&n,&m);

50         num=dfs(n,m);

51         printf("%I64d\n",num%m);

52     }

53     return 0;

54 }

 

 

你可能感兴趣的:(HDU)