NZEC用于python中的fibosum(spoj)

时间:2012-10-08 12:58:27

标签: python

代码在我的翻译上工作得非常好,但是给了NZEC一个黑色的。

cases = int(raw_input())
for i in xrange(cases):
    k = 0
    n,m = map(int, sys.stdin.readline().split())
    sq5 = Decimal(sqrt(5))
    phi = (1 + sq5)/2                          #Refer wikipedia page for calculating fibonacci numbers
    print (int(Decimal(phi)**(m+2)/sq5 + Decimal(0.5)) - int(Decimal(phi)**(n+1)/sq5 + Decimal(0.5)))%1000000007

我做错了什么?

2 个答案:

答案 0 :(得分:0)

这可能是由于 OverflowError

当10 ^ 9中的m值非常大时,内置 pow()函数(即**运算符)的效果不如预期。

>>> (1.1)**1000000000

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
1.1**(100000000)
OverflowError: (34, 'Numerical result out of range')

即使 math.pow()也无效。

>>> import math
>>> math.pow(1.1,1000000000)

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
math.pow(1.1,1000000000)
OverflowError: math range error

而是使用Matrix方法代替 Binet的Fibonacci公式来通过 O(ln m)。在 Binet的公式中为权力创造天真的功能可能最终会达到 O(m)

答案 1 :(得分:0)

检查我的代码也是:     #包括     使用命名空间std;

#define mod 1000000007

long long result[2][2]={{1,1},{1,0}};
long long transformation[2][2]={{1,1},{1,0}};    
void matrixMul(long long a[2][2],long long b[2][2])
{
 int i,j,k;
 long long re[2][2] ={0};
 for(i=0;i<2;i++) {
    for(j=0;j<2;j++) {
        for(k=0;k<2;k++) {
            re[i][j] = (re[i][j] + (a[i][k]*b[k][j])%mod ) % mod;
        }
    }
 }
 for(i=0;i<2;i++)
 {
    for(j=0;j<2;j++)
        result[i][j]=re[i][j];
 }
}

void initialize() {
result[0][0]=result[0][1]=result[1][0]=1;
result[1][1]=0;
}
void power(int n)
{
if(n==1)
return ;
power(n/2);
matrixMul(result,result);
if(n&1)
{
    matrixMul(result,transformation);
}
}

int main()
{   
int t;
cin>>t;
while(t--){
initialize();
long long n,m;
cin>>n>>m;
long long x,y;
if(n == 0 || n == 1) {
        x=n;
}
else {
    power(n);
    x=result[0][0]-1;
}
initialize();
if(m == 0 || m == 1) {
        x=m;
}
else {
    power(m+1);
    y=result[0][0]-1;
}
if(x>y){
    x=x-y;
}
else
    x=y-x;

cout<<((x+mod)%mod)<<endl;
}
return 0;
}