UVa11582 Colossal Fibonacci Numbers!

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn = 10005; //如果是1005就会RE,当不确定时,最好取大点。
 7 int A[maxn];
 8 #define LL unsigned long long // 注意不能用long long, 因为long long
 9                               // 最大值只能取到2 ^63 - 1
10 LL a, b;
11 int n, mod, T, t;
12
13 int Period()
14 {
15     A[0] = 0, A[1] = 1 % mod; //这里的取值也是要细心的。
16     int i = 2;
17     while(1)
18     {
19         A[i] = (A[i-1]+A[i-2]) % mod;
20         if(A[i] == A[0] && (A[i-1]+A[i])%mod == A[1]) return i;
21         i ++;
22     }
23     return 1;
24 }
25
26 int Pow(int x,LL n)
27 {
28     int ans = 1;
29     while(n)
30     {
31         if(n & 1) ans *= x;
32         x *= x, n >>= 1;
33         ans %= mod, x %= mod;
34     }
35     return ans;
36 }
37
38 int main()
39 {
40     scanf("%d", &t);
41     while(t --)
42     {
43         //scanf("%I64d %I64d %d", &a, &b, &n); 这两种方式在UVa中交都是WA,
44         //scanf("%lld %lld %d", &a, &b, &n);  特别注意当不确定时,最后用cin;
45         cin >> a >> b >> n;
46         mod = n;
47         T = Period();    //求出周期
48         mod = T;
49         int x = Pow(a%mod, b); //x为第一个周期中对应值的下标
50         printf("%d\n", A[x]);
51     }
52     return 0;
53 }

时间: 2024-11-05 19:05:33

UVa11582 Colossal Fibonacci Numbers!的相关文章

UVA11582 Colossal Fibonacci Numbers!(fibonacci序列模x的周期性)

题意:两个非负整数a,b<2^64 计算斐波拉契序列f(a^b)mod x  (x<1000) 思路:显然a^b只能用快速幂,而且还必须要取模,所以去尝试找f(n)mod x的周期 不能发现当二元组(f[i]%x,fp[i-1]%x)=(f[0]%x,f[1]%x) 的时候开始循环,所以周期为i 因为f[n]%x的余数最多只有1000种所以在f[0...n^2]以内就能找到周期 <span style="font-size:14px;">// Accepted

UVa11582 - Colossal Fibonacci Numbers!(模运算)

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include<vector> #include<map> #include<set> #include<queue> #include<algorithm> using namespace std; typedef

uva11582 Colossal Fibonacci Numbers(分治法)

题意:输入两个非负整数a.b和正整数n(a,b>=0&&a,b<2^64,n>=1&&n<=1000),你的任务是计算f(a^b)除以n的余数.其中f(0)=f(1),且对于所有非负整数i,f(i+2)=f(i+1)+f(i) 解题思路:设F(i)=f(i) mod n.不难发现当(F(i),F(i+1))重复出现时,整个序列就开始重复.所以我们需要找到对于不同的n重复周期,因为余数有n中,所以最多n^2项就会出现重复(其实我们也可以通过打表观察,在

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!(打表+快速幂)

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

题目链接: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 所以设周

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,所以之后的序列都会重复. 至