3

对于一个给定的bandN和一个范围asay (0...n)

我需要找到ans(0...n-1) 在哪里,

ans[i]=a's没有pow(a, b)modN == i

我在这里搜索的是一个可能的重复pow(a,b)modN范围a,以减少计算时间。

例子:-

如果b = 2 N = 3n = 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

...

4

2 回答 2

1

您的算法的复杂度为 O(n)。这意味着当 n 变大时需要很长时间。

您可以使用算法 O(N) 获得相同的结果。由于 N << n 它将减少您的计算时间。

首先,两个数学事实:

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;
}
于 2013-08-04T11:05:55.017 回答
0

您只能计算pow素数,然后使用pow(a*b,n) == pow(a,n)*pow(b,n).

所以如果pow(2,2) mod 3 == 1pow(3,2) mod 3 == 2,那么pow(6,2) mod 3 == 2

于 2013-08-04T10:25:22.087 回答