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

发布于 2022-09-05 09:23:41 字数 2082 浏览 13 评论 0

先贴上我有问题的代码,时在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的值,这是为什么?很是想不明白,希望大家能指点我,多谢了!


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文