[英]Calculate (a^b)%c where 0<=a,b,c<=10^18
我如何計算(a ^ b) % c
,其中0 <= a, b, c <= 10^18
。 這里, (a ^ b)
表示a
的b
冪,而不是a xor b
。
我目前的問題代碼是:
unsigned long long bigMod(unsigned long long b,
unsigned long long p,
unsigned long long m){
if(b == 1) return b;
if(p == 0) return 1;
if(p == 1) return b;
if(p % 2 == 0){
unsigned long long temp = bigMod(b, p / 2ll, m);
return ((temp) * (temp) )% m;
}else return (b * bigMod(b, p-1, m)) % m;
}
對於此輸入:
a = 12345 b = 123456789 and c = 123456789012345
預期的輸出應該是:
59212459031520
您有 temp*temp 問題(長長溢出)。 您可以使用快速模冪算法將它們乘以模 m 來忽略此問題。 這里你有工作代碼:
unsigned long long bigMultiply(unsigned long long b,unsigned long long p, unsigned long long m)
{
if(p == 0 )return b;
if(p%2 == 0)
{
unsigned long long temp = bigMultiply(b,p/2ll,m);
return ((temp)+(temp))%m;
}
else
return (b + bigMultiply(b,p-1,m))%m;
}
unsigned long long bigMod(unsigned long long b,unsigned long long p, unsigned long long m)
{
if(b == 1)
return b;
if(p == 0 )return 1;
if( p == 1)return b;
if(p%2 == 0)
{
unsigned ll temp = bigMod(b,p/2ll,m);
return bigMultiply(temp,temp,m);
}
else
return (b * bigMod(b,p-1,m))%m;
}
我在 C++ 中使用此代碼:
long long power(long long a, long long b, long long c)
{
if (b==0)
{
return 1;
}
if (b % 2 == 0)
{
long long w = power(a, b/2, c);
return (w*w) % c;
}
else
{
int w = power(a, b-1, c);
return (a*w) % c;
}
}
它具有對數復雜度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.