UVA11582 Colossal Fibonacci Numbers!(斐波那契数列循环节)

UVA11582 Colossal Fibonacci Numbers!

Description

The i’th Fibonacci number f(i) is recursively defined in the following way:
• f(0) = 0 and f(1) = 1
• f(i + 2) = f(i + 1) + f(i) for every i ≥ 0
Your task is to compute some values of this sequence.

Input

Input begins with an integer t ≤ 10, 000, the number of test cases.
Each test case consists of three integers a, b, n where 0 ≤ a, b < 2^64 (a and b will not both be zero) and 1 ≤ n ≤ 1000.

Output

For each test case, output a single line containing the remainder of f(a^b) upon division by n.

Sample Input

3
1 1 2
2 3 1000
18446744073709551615 18446744073709551615 1000

Sample Output

1
21
250

题解

题意

计算斐波那契数列第a^b%n的值

思路

被搞炸了,事实上该数列存在循环节。组数在1e5的范围,单独处理会超时。找到每个n值对应的循环节长度即可。注意一点a,b都在2^64 需要使用unsigned long long,但是这种情况下的取模就要小心了,unsigned long long和int 之间的取模转化要小心。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
 
const int maxn = 1005;
int f[maxn][6*maxn],p[maxn];
 
int pow_mod(ULL a,ULL b,int n){
    if(b==0) return 1;
    int k=pow_mod(a,b/2,n);
    k=k*k%n;
    if(b%2==1) k=k*a%n;
    return k;
}
 
int solve(ULL a,ULL b,int n){
    if(a==0||n==1) return 0;
    int idx=pow_mod(a%p[n],b,p[n]);
    return f[n][idx];
}
int main()
{
    int ncase;
    int n;
    for(int n=2;n<=1000;n++){
        f[n][0]=0; f[n][1]=1;
        for(int i=2;;i++){
            f[n][i]=(f[n][i-2]+f[n][i-1])%n;
            if(f[n][i-1]==0&&f[n][i]==1){
                p[n]=i-1;
                break;
            }
        }
    }
    scanf("%d",&ncase);
    while(ncase--){
        ULL a,b;
 
        cin>>a>>b>>n;
        cout<<solve(a,b,n)<<"\n";
    }
    return 0;
}

posted @ 2018-09-04 15:27  caomp  阅读(169)  评论(0)    收藏  举报