UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)

Posted Reqaw’s Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)相关的知识,希望对你有一定的参考价值。

题目链接:https://cn.vjudge.net/problem/UVA-11582

 1 /*
 2 问题
 3 输入a,b,n(0<a,b<2^64(a and bwill not both be zero) and 1<n<1000)
 4 计算并输出f(a^b)%n的结果
 5 其中f(i)是斐波那契数列
 6  
 7 解题思路
 8 所有的结果都是f(i)对n取模,不妨设F(i)=f(i)%n。不难发现当F(i),F(i+1)出现重复的时候,整个序列就开始出现重复。
 9 
10 所以设周期为mod,计算出一个循环周期F(0)~f(n^2-1),计算出F(a^b % mod)即可。 
11 */
12 #include<cstdio>
13 #include<iostream>
14 #include<string>
15 using namespace std;
16 
17 const int N=1000110;
18 int F[N],mod;
19 int makeF(int n);
20 int kpow(unsigned long long a,unsigned long long p);
21 
22 int main()
23 {
24     unsigned long long a,b;
25     int n,T;
26     scanf("%d",&T);
27     while(T--){
28         cin>>a>>b>>n;
29         if(n==1||!a) {printf("0\n");continue;}
30         mod=makeF(n);
31         printf("%d\n",F[kpow(a%mod,b)]);
32     }
33     return 0;    
34 } 
35 
36 int kpow(unsigned long long a,unsigned long long p){
37     int ans=1;
38     for(;p;p>>=1,a=(a*a)%mod) if(p&1) ans=(ans*a)%mod;
39     return ans;
40 }
41 
42 int makeF(int n)
43 {
44     F[0]=0;
45     F[1]=1;
46     F[2]=1;
47     int l=n*n+10;
48     for(int i=3;i<=l;i++){
49         F[i] = ((F[i-1]%n)+(F[i-2]%n))%n;
50         if(F[i]==F[2] && F[i-1]==F[1]){
51             return i-2;
52         }
53     }
54 }

 

以上是关于UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)的主要内容,如果未能解决你的问题,请参考以下文章

UVA - 11582 Colossal Fibonacci Numbers!循环节

UVa 11582 - Colossal Fibonacci Numbers!(数论)

Colossal Fibonacci Numbers! UVA - 11582

uva11582 Colossal Fibonacci Numbers!

UVA11582 Colossal Fibonacci Numbers!

UVa 11582 Colossal Fibonacci Numbers! 大数幂取模