https://vjudge.net/problem/UVA-11582

 

题意:求 斐波那契数列第a^b 项 %n的余数

a,b < 2^64,n<1000

 

找循环节,最多n^2项一定会出现循环节

 

#include<cstdio>
using namespace std;
typedef unsigned long long LL;
int f[1000010];
void read(LL &x)
{
    x=0; char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0' && c<='9') { x=x*10+c-'0'; c=getchar(); }
}
int main()
{
    int T;
    scanf("%d",&T);
    LL a,b; int n;
    while(T--)
    {
        read(a); read(b); scanf("%d",&n);
        if(n==1) { printf("0\n"); continue; }
        f[1]=f[2]=1;
        int i;
        for(i=3;;i++)
        {
            f[i]=(f[i-2]+f[i-1])%n;
            if(f[i]==1 && f[i-1]==0) break;
        }
        i--;
        int g=1;  a%=i;
        for(;b;b>>=1,a=a*a%i) 
         if(b&1) g=g*a%i;
        printf("%d\n",f[g]);
    }
}
 
作者:xxy
本文版权归作者所有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。