(a*b)%c問題

3568 ワード


 
二つの数をあげるint 64型の整数a,b,c.あなたに闻いて、(a*b)%cの値はいくらですか??我々は,(a*b)%c=((a%c)*(b%c))%cを知っている.しかし、それでもcが大きい場合、(a%c)*(b%c)は境界を越えます.次に、バイナリの実装コードを示します.
  
 1 #include<cstdio>

 2 #include<cstring>

 3 using namespace std;

 4 

 5 __int64 Pow(__int64 a, __int64 b, __int64 c)

 6 {

 7     a %= c;

 8     b %= c;

 9     __int64 ret = 0;   //  (a*b)%c  。

10     while(b)

11     {

12         if(b&1)

13             ret += a, ret %= c;

14         a <<= 1; a %= c;  //a  b               。

15         b >>= 1;  //b                          ,

16     }

17     return ret;

18 }

19 

20 int main()

21 {

22     __int64 a, b, c;

23     while(~scanf("%I64d%I64d%I64d", &a, &b, &c))

24     {

25         printf("%I64d
", Pow(a, b, c)); 26 } 27 return 0; 28 }