UVA 11582 巨大的斐波那契数!

因为数太大一定会溢出,所以找规律,发现最多n²会出现重复。

先计算出一个周期里的,所有满足f(a的b次幂)处以n的余数,接下来就是匹配,

让a的次幂匹配到这个周期里对应的下标,把含有该下标的除以n的余数输出。

注意unsigned long long 不要在while循环里写,不然会栈溢出。

此外通过此题,还学会了如何用位运算求a的b次幂。

 if(b&1){
            ans=ans*a%T;
            b--;
        }

这个用来算长度为n-1的位,

 a=a*a%T;

b>>=1;

这个用来算第n位

 

 

#include<bits/stdc++.h>

using namespace std;

int f[1000005];

int fi(unsigned long long a,unsigned long long b,int T){
    int ans=1;
    while(b){
        if(b&1){
            ans=ans*a%T;
            b--;
        }
        a=a*a%T;
        b>>=1;
        
    }
    return ans;
}
unsigned long long  a,b;
int main(){
    
    int n,T=1;
    scanf("%d",&n);
    while(n--){
        int n;
        scanf("%llu %llu %d",&a,&b,&n);
         if(n==1||a==0)
        {
            cout<<0<<endl;
            continue;
        }
        f[0]=0; f[1]=1;
        for(int i=2;i<=n*n+100;i++){
        f[i]=(f[i-1]+f[i-2])%n;    
        if(f[i]==f[1] && f[i-1]==f[0]){
            T=i-1; 
            break;
        }                
    }    
    int gg=fi(a%T,b,T);
    printf("%d\n",f[gg]);            
    }    
    
}

 

发布了57 篇原创文章 · 获赞 58 · 访问量 649

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103575416