C 求a'范围内的pow(a^b)modN;s

C 求a'范围内的pow(a^b)modN;s,c,algorithm,math,modulo,C,Algorithm,Math,Modulo,对于给定的b和N以及a范围,例如(0…N) 我需要找到ans(0…n-1) 在哪里, ans[i]=其中a的数量pow(a,b)modN==i 我在这里搜索的是pow(a,b)modN中可能重复的a,以减少计算时间 例如:- 如果b=2N=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)mo

对于给定的
b
N
以及
a
范围,例如
(0…N)

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

ans[i]
=其中
a的数量
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//我们找到0作为答案的次数。

ans[1]=3


..

您可以仅为素数计算
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

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

使用算法O(N)可以得到相同的结果。
这个问题来自哪个编码竞赛?请给出一个例子,以便我们理解这个问题。@UchiaItachi更新。。不确定是否理解你的例子。你写了pow(3,2)mod3=2。但是pow(3,2)=9。9mod3=0。@GerardWalace哎呀。。更新。<代码>“你的算法有O(N)”的复杂性<代码> -我不确定我会考虑<代码> A^ B < /代码>是<代码> O(1)< /代码>操作。你说得对。但这取决于处理器体系结构。例如,在x86上,它应该是一个时间常数操作。不过,我必须承认,我可能过度简化了我的竞争性计算,没有考虑到这一点,因为这对两种算法的影响是相同的。谢谢你的评论。
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;
}