幂取模

  幂取模这道题刚开始没怎么看,写了一个int的程序,只过了小数据,所以超时,得了32分,我就想办法优化我的函数,超时的主要原因是在与b^p太大,所以我们要想办法减少时间复杂度,通过数学知识我们可以知道,bp=b2/p*b2/p(p为偶数时候),bp=b2/(p-1)*b2/(p-1)*b(b为奇数的时候),

所以我们可以写出函数:

long long f(long long x,long long n)
{
long long d;
if (n==1)
return x%d;
else if (n>1)
{
long long s;
long long m=n/2;
s=f(x,m);
if (n%2==0)
return s*s%d;
else
return s*s*x%d;
}
}

但是这也是错的,我设了一个long long d来代替long long k,这很明显,是错误的,我们应该直接用全局变量k来进行,所以正确的是:

long long b,p,k;
long long f(long long x,long long n)
{
if (n==1)
return x%k;
else if (n>1)
{
long long s;
long long m=n/2;
s=f(x,m);
if (n%2==0)
return s*s%k;
else
return s*s*x%k;
}
}

原文地址:https://www.cnblogs.com/blood-darkness/p/5965408.html