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 }

 

转载于:https://www.cnblogs.com/wenzhixin/p/9016247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值