码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-09 21:06:35      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:斐波那契数   amp   str   const   names   mes   序列   number   题目   

题目链接: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!(循环节打表+幂取模)

标签:斐波那契数   amp   str   const   names   mes   序列   number   题目   

原文地址:https://www.cnblogs.com/wenzhixin/p/9016247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!