计算满足给定条件的x的值

时间:2014-10-09 20:27:46

标签: algorithm

给定一个数字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。

3 个答案:

答案 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(在评论中提到)。对于i0P + 1不包括的1,请计算0包含iint[] 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) 并将它们全部按顺序排列在彼此之下,只需找到它们之间链接的等式,类似于找到数字序列的等式。

如果我已回答你的问题,请告诉我。