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;
}