如何获得GCD(2^a[I]-1,2^a[j]-1) 1<;=a[x]<;=100
from fractions import gcd
powj=pow(2,n[j])-1
powk=pow(2,n[k])-1
gcdjk=gcd(powj,powk)
对于大数值会导致问题,并产生运行时错误。
我在2^I-1值中看不到模式,除了除了除了1和它们本身之外没有其他因子的素数。在
编辑:只需为表格2^i-1的数字求解此问题。代码如下:
import sys
import math
from fractions import gcd
t=int(input())
for i in range(0,t):
door=0
c=int(input())
n = map(int,sys.stdin.readline().split(' '))
for j in range(0,c-1):
for k in range(j+1,c):
if( gcd(n[j],n[k]) == n[k]):
powj=pow(2,n[j])-1
powk=pow(2,n[k])-1
gcdjk=gcd(powj,powk)
if(gcdjk==powk):
door = door+1
else:
door = door-gcdjk
print (door)
输入样本:
2
3
10 2 3
2
3 5
限制条件:
1<=T<=20
1<=ArraySize<=10^5
1<=a[i]<=100
这里有一个简单的方法,你可以使用欧几里得的算法来求解二次幂,而不需要实际计算它们:
进一步分析:-
参考号:-GCD
考虑一下binary GCD algorithm。如果两个操作数的形式都是2i-1,则可以大大简化。在
首先,在第一步的末尾显然没有零,所以直接进入循环。在
在循环中,在减法中,您有两个形式为2i-1的数字,并且左手边比右手边大,所以减法只重设}中设置的位一样多,也就是说,减法相当于
y
中的低位与{y &= ~x
。减法之后紧接着将y
右移,后面的零个数是2i-1,但是popcnt(x)
要短一些。在由此看来,只有长度(即指数)才是重要的,恒等式
gcd(2a-1,2b-1)=2gcd(a,b)-1紧随其后。在
这些数字很小。使用Python内置的bignum处理,它们完全可以满足
fractions.gcd
使用的欧几里德算法:你的错误来自其他地方。当您尝试迭代10000个元素列表中的所有对数字时,您甚至可能只是超时了。大约有5000万对。根据你得到的时间,你的算法可能只是太慢了。在
相关问题 更多 >
编程相关推荐