对于给定的b
和N
以及一系列a
说(0...n)
,
我需要找ans(0...n-1)
在哪里,
ans[i]
= a's
的pow(a, b)modN == i
的否
我在这里搜索的是pow(a,b)modN
可能会在a
范围内重复,以减少计算时间。
实施例: -
如果b = 2
N = 3
和n = 5
for a in (0...4):
A[pow(a,b)modN]++;
这样就是
pow(0,2)mod3 = 0
pow(1,2)mod3 = 1
pow(2,2)mod3 = 1
pow(3,2)mod3 = 0
pow(4,2)mod3 = 1
所以最终结果将是:
ans[0] = 2 // no of times we have found 0 as answer .
ans[1] = 3
...
答案 0 :(得分:1)
您的算法的复杂度为O(n)。 这意味着当n变大时需要花费很多时间。
您可以使用算法O(N)获得相同的结果。 如N <&lt;它会减少你的计算时间。
第一,两个数学事实:
pow(a,b) modulo N == pow (a modulo N,b) modulo N
和
if (i < n modulo N)
ans[i] = (n div N) + 1
else if (i < N)
ans[i] = (n div N)
else
ans[i] = 0
因此,解决问题的方法是使用以下循环填充结果数组:
int nModN = n % N;
int nDivN = n / N;
for (int i = 0; i < N; i++)
{
if (i < nModN)
ans[pow(i,b) % N] += nDivN + 1;
else
ans[pow(i,b) % N] += nDivN;
}
答案 1 :(得分:0)
您只能为素数计算pow
,并使用pow(a*b,n) == pow(a,n)*pow(b,n)
。
因此,如果pow(2,2) mod 3 == 1
和pow(3,2) mod 3 == 2
,则pow(6,2) mod 3 == 2
。