给定一个数字P,我们需要找到满足这个条件的x值的计数:
(x^3 - 1)%P = 0
现在我需要计算在区间[L,R]中满足此等式的x的x值。
我的尝试: x ^ 3 - 1 =(x-1)(x ^ 2 + x + 1)= 0
一个根显然是x = 1,其他根必须来自二次方,其判别式为
Δ=1−4⋅1⋅1 = −3
因此,除了一个, 还有其他根,当且仅当-3是方模p
但如何在范围[A,B]中找到这些?请帮忙
示例:设A = 1,B = 100,P为2,则答案为50。
答案 0 :(得分:1)
我会做的是
int count = 0;
for(int x = A;x<=B;x++){
if((((int)(Math.pow(x,3))-1)%p) ==0){
count++;
}
}
答案 1 :(得分:1)
这里的关键是限制P ≤ 100000
(在评论中提到)。对于i
从0
到P + 1
不包括的1
,请计算0
包含i
和int[] cumsum = new int[P + 1];
for (long i = 0; i < P; i++) {
cumsum[i + 1] = cumsum[i] + (i*i*i % P == 1 ? 1 : 0);
}
之间P
的多维数据集根数。
((B + 1) / P) * cumsum[P] + cumsum[(B + 1) % P] -
((A / P) * cumsum[P] + cumsum[A % P]),
通过模运算的属性,此解决方案模式重复每个0
个数字。答案就是
B
其中第一行计算从0
包含到A
的解决方案的数量,第二行计算从{{1}}包含到{{1}}独占的解决方案的数量
答案 2 :(得分:0)
@πάνταῥεῖ 我想知道你的等式是否总是x ^ 3 - x立方, 所以我注意到它总是x立方体,方程式很简单 (B - (A-1))/ p并将答案设为int以获得整数
所以我相信我回答了你的问题。但如果你想根据需要改变功率符号,那么等式变得更加复杂 在这种情况下,只需解决模式,即记下它涉及的许多数字组合 (范围大小),(X ^(exp)),(p) 并将它们全部按顺序排列在彼此之下,只需找到它们之间链接的等式,类似于找到数字序列的等式。
如果我已回答你的问题,请告诉我。