标签:style blog io color sp div 问题 log bs
给你两个数__int64 类型的整数 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\n", Pow(a, b, c)); 26 } 27 return 0; 28 }
标签:style blog io color sp div 问题 log bs
原文地址:http://www.cnblogs.com/khan724/p/4138142.html