求斐波那契数的一个取模运算的问题

先贴上我有问题的代码,时在51nod上做求斐波那契数的问题。

#include <iostream>
using namespace std;
long long int C[2][2]={{1,1},{1,0}};

void matrixmultiply(long long int a[][2],long long int b[][2]);

void fibonacci(long long int a[][2],long long int n){
    if(n%2==0){
        if(n==0){
            a[0][0]=1;
            a[0][1]=0;
            a[1][0]=0;
            a[1][2]=1;
            return ;
        }
        fibonacci(a,n/2);
        matrixmultiply(a,a);
    }
    else{
        fibonacci(a,(n-1)/2);
        matrixmultiply(a,a);
        matrixmultiply(a,C);
    }
}
void matrixmultiply(long long int a[][2],long long int b[][2]){
    long long int c[2][2],d[2][2];
    for(int i=0;i<2;++i)
        for(int j=0;j<2;++j){
            c[i][j]=a[i][j];
            d[i][j]=b[i][j];
        }
    long long int temp=0;
    for(int i=0;i<2;++i)
        for(int j=0;j<2;++j)
        {
            for(int k=0;k<2;++k)
                temp+=c[i][k]*d[k][j];
            a[i][j]=temp%1000000009;
            //在这里temp不加%1000000009和加了之后计算结果不同
            //这是为什么?
            cout<<temp<<" "<<a[i][j]<<endl;
            temp=0;
        }
}

int main(){
    long long int a[2][2]={{1,1},{1,0}};
    long long int N;
    cin>>N;
    fibonacci(a,N);
    cout<<a[0][3]%1000000009<<endl;
    return 0;
}

在写matrixmultiply函数时候我有两种不同的做法(只贴局部代码),第一种是


a[i] [j]=temp%1000000009;
cout<<temp<<" "<<a[i] [j]<<endl;

这样能通过测试点;


但是第二种做法就不行,代码如下:


a[i] [j]=temp;
cout<<temp<<" "<<a[i] [j]%1000000009<<endl;

两种做法的在N=220的输出为:
(1)
图片描述

(2)
图片描述

仅仅是对temp取模,但是没有给temp赋值,但是却改变了temp的值,这是为什么?很是想不明白,希望大家能指点我,多谢了!


阅读 1.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题