uva10229-模Fibonacci

题目链接 http://vjudge.net/problem/UVA-10229

解题思路

一开始想到一种O(n)的算法,就是每次只算fib的二进制后m位,然后就TLE了。。。

比较正确的解法是用矩阵快速幂。大概是O(log(n))的算法,对任何数据都很快。。。

要注意n=0的情况。。。

代码

#include<stdio.h>
#include<string.h>
typedef long long ll;
ll ans[2][1], t[2][2] = {1}, s[2][2];
ll base[2][2] = {0, 1, 1, 1};
ll mod;
void copy(ll a[][2], ll b[][2])
{
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            a[i][j] = b[i][j];
}
void mul(ll a[][2], ll b[][2], ll c[][2])
{
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            a[i][j] = 0;
    for(int i=0; i<2; i++)
        for(int j=0; j<2; j++)
            for(int k=0; k<2; k++)
                a[i][j] += (b[i][k] * c[k][j]) % mod;
}
int cal(ll n)
{
    if(n == 1) copy(s, base);
    else {
        cal(n/2);
        copy(t, s);
        mul(s, t, t);
        if(n % 2 == 1){
            mul(t, s, base);
            copy(s, t);
        }
    }
}
int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) == 2) {
        if(n >= 1) {
            mod = 1 << m; cal(n);
            printf("%d\n", s[0][1]%mod);
        }
        else printf("0\n");
    }
    return 0;
}    
时间: 2024-12-23 19:33:22

uva10229-模Fibonacci的相关文章

广义Fibonacci数列模n的循环节

见这里:http://blog.csdn.net/ACdreamers/article/details/25616461 有详细的分析推理 只找出了循环节的上限,设 f[n] = (af[n - 1] + b[n - 2])%P,设序列a ={ f[1], f[2] }, 考虑t项后, b ={ f[t + 1], f[t + 2] }, 当t = p * p + 1时, 最多可以产生p * p + 1个不同的序列,其中至少会有一个与a相同, 而一旦与a相同,那么后面的项也会与a后面的项一样,所

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

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!

题意: 斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0) 输入a.b.n,求f(ab)%n 分析: 构造一个新数列F(i) = f(i) % n,则所求为F(ab) 如果新数列中相邻两项重复出现的话,则根据递推关系这个数列是循环的. 相邻两项所有可能组合最多就n2中,所以根据抽屉原理得到这个数列一定是循环的. 求出数列的周期,然后快速幂取模即可. 1 #include <cstdio> 2 #include <iostrea

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 所以设周

Fibonacci数列(数列 取模)

问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单. 样例输入 10 样例输出 55 样例输

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

HDU1588-Gauss Fibonacci(矩阵快速幂+等比数列二分求和)

题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum,并对m取模. 思路: 设A = |(1, 1),(1, 0)| sum = f(b) + f(k + b) + f(2k + b)...+f((n-1)k + b) (f(x) 为Fibonacci数列) sum = A^b + A^(k + b) + A^(2k + b)...+ A^((n-1)k + b) sum = A^b(1 + A^k + A^2k

Fibonacci数列的性质

Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, .... F[0] = 0; 1: gcd(Fn, Fm) = F[gcd(n, m)]; 当n - m = 1 或 2时满足,可用数学归纳法证明: 2: 特征方程为 x^2 = x + 1, 类Fibonacci数列的特征方程为:ax^2 = bx + c; aF[n] = bF[n - 1] + cF[n - 2]; 3: (证明方法为补项和数学归纳法) f[0] + f[1] + ... + f[n] = f[n +