11582 - Colossal Fibonacci Numbers!

像刘汝佳书上说的,斐波那契数有一个叫尾数循环的性质:个位数是一个60步的循环,最后两位数是一个300步的循环。。。但是不会超过n^2;感兴趣的朋友可以查一查。

所以问题就变成了求a^b这个超大的数mod n等于多少,也就是所谓的幂取模利用递归,将大数分解取模;

但是要注意,0对任何数取模都是0,任何数对1取模都是0;

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const int maxn = 1000000+10;
int f[maxn],kase;
int pow_mod(ULL a,ULL n,int m) {
    if(n==0) return 1;
    ULL x=pow_mod(a,n/2,m);
    ULL ans = (ULL)x * x % m;
    if(n%2==1)   ans = ans*a%m;
    return (int )ans;
}
int solve(ULL a,ULL b,int n) {
    if(a==0||n==1) return 0;
    for(int i=2;;i++){
        f[i]=f[i-1]+f[i-2];
        f[i]=f[i]%n;
        if(f[i-1]==0&&f[i]==1) { kase=i-1;break; }
    }
    int v=pow_mod(a%kase,b,kase);
    return f[v];
}
int main() {
    int t,n;
    ULL a,b;
    scanf("%d",&t);
    while(t--) {
        cin>>a>>b>>n;
        f[0]=0;
        f[1]=1;
        printf("%d\n",solve(a,b,n));
    }
    return 0;
}

时间: 2024-08-26 16:24:17

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! (巨大的斐波那契数!)

题意:输入两个非负整数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,所以之后的序列都会重复. 至

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!(数论)

 题意:输 入两个非负整数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取模,余数只有n种,所以最多n^2项序列就开始重复,所以问题转化成了求周期然后大整数取模. #include<cstdio> #include<cstring> #include<cmath&

UVa 11582 Colossal Fibonacci Numbers!

题意:给出a,b,n计算f(a^b)%n的值,其中f(i)=f(i-2)+f(i-1) 学习的紫书,自己做的时候想的是,每次输入一个n,再打表找, 后来看了标程,发现是用一个二维数组直接就将不同的n对应的周期存储下来了 另外还要注意的是0的任何次方为0 还有找周期的时候,第一次看的时候不理解, 后来觉得应该是这样的 一个数模上n的余数有n种 0,1,2,3,4,---,n-1共n种 然后在前n*n个数里面,可以每一种余数分配n个数,所以就是n*n个数,当再多一个数的时候一定就会重复了 1 #in