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

时间: 2024-08-21 22:50:03

UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)的相关文章

UVA 11582 Colossal Fibonacci Numbers!(打表+快速幂)

Colossal Fibonacci Numbers! 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 begins with an int

UVA 11582 Colossal Fibonacci Numbers! 找循环节

注意n=1的情况 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #inc

UVA 11582 Colossal Fibonacci Numbers! 数学

n比较小,最多n*n就回出现循环节.... Colossal Fibonacci Numbers! Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem F: Colossal Fibonacci Numbers! The i'th Fibonacci number f (i) is recursively defined in the

UVa 11582 Colossal Fibonacci Numbers! 【大数幂取模】

题目链接:Uva 11582 [vjudge] 题意 输入两个非负整数a.b和正整数n(0<=a,b<=2^64,1<=n<=1000),让你计算f(a^b)对n取模的值,当中f(0) = 0,f(1) =  1.且对随意非负整数i.f(i+2)= f(i+1)+f(i). 分析 全部的计算都是对n取模.设F(i) =f(i)mod n, 非常easy发现,F(x)是具有周期性的,由于对N取模的值最多也就N个,当二元组(F(i-1),F(i))反复的时候.整个序列也就反复了.周期i

UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)

巨大的斐波那契数! 题目大意:斐波那契数列f[N],给你a,b,n,求f[a^b]%n. 思路:数论题.f[a^b]%n是有周期的,我们求出来这个周期后就可以将简化成f[(a%周期)^b]%周期运用分治法幂取模. 注意用unsigned long long(貌似是 long long的二倍),不然会溢出,又学了一招... 不知道哪的bug,一直改不对,一直,后来捡来别人的和自己一样的代码一改就对了,,, #include<iostream>//UVA #include<cstdio>

UVA - 11582 Colossal Fibonacci Numbers!循环节

找Fn =( Fn-1 + Fn-2 ) mod n 的循环节 暴力找即可 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 typedef unsigned long long ll; 5 using namespace std; 6 const int MAXN = 1023; 7 ll f[MAXN][MAXN*10]; 8 int circle[MAXN]; 9 10 void in

UVa 11582 - Colossal Fibonacci Numbers!(数论)

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2629 题意: 输入两个非负整数a.b和正整数n(0≤a,b<2^64,1≤n≤1000),你的任务是计算f(a^b)除以n的余数.其中f(0)=0,f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i). 分析: 所有计算都是对n取模的,设F(i)=f(i)

UVA - 11582 Colossal Fibonacci Numbers! (巨大的斐波那契数!)

题意:输入两个非负整数a.b和正整数n(0<=a,b<264,1<=n<=1000),你的任务是计算f(ab)除以n的余数,f(0) = 0, f(1) = 1,且对于所有非负整数i,f(i + 2) = f(i + 1) + f(i). 分析: 1.对于某个n取余的斐波那契序列总是有周期的,求出每个取值的n下的斐波那契序列和周期. 2.ab对T[n]取余,即可确定对n取余的斐波那契序列中f(ab)的位置. #pragma comment(linker, "/STACK:

UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵快速幂,输出等了几秒钟才输出完,肯定会超时.因为所有计算都是要取模的,设F[i]=f[i] mod n.F[0]=F[1]=1.只要出现F[i]=F[i+1]=1,那么整个序列就会重复.例如n=3,则序列为1,1,2,0,2,2,1,0,1,1……第九项和第十项都等于1,所以之后的序列都会重复. 至