2019牛客暑期多校训练营(第九场) A The power of Fibonacci 斐波那契循环节

题目链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:
首先,我们要知道fibonacci序列模n的话是有一个循环节的存在,那对于题目这样的fibonacci也同样是有循环节的存在;

我们知道Fibonacci数列,现在我们来求一个Fib数模n的循环节的长度。

对于一个正整数n,我们求Fib数模n的循环节的长度的方法如下:

(1)把n素因子分解,即n=p1^a1*p2^a2……pk^ak

(2)分别计算Fib数模每个p^m的循环节长度,假设长度分别是x1,x2,x3……,xk

(3)那么Fib模n的循环节长度L=lcm(x1,x2,x3……,xk)

从上面三个步骤看来,貌似最困难的是第二步,那么我们如何求Fib模Pm的循环节长度呢?

 这里有一个优美的定理:Fib数模P^m的最小循环节长度等于G(p)*p^(m-1),其中表示Fib数模素数的最小循环节长度。可以看出我们现在最重要的就是求G(p)

对于求G§我们利用如下定理:

如果5是模的二次剩余,那么循环节的的长度是p-1的因子,否则,循环节的长度是2*(p-1)的因子。

顺便说一句,对于小于等于5的素数,我们直接特殊判断,loop(2)=3,loop(3)=8,loop(5)=20。

其实对于其他关于这样递推的公式,都是存在类似的循环节的特征的

对于mod是一个合数,那么下意识的就要将这个数变成素数的乘机啦
1e9=29*59

那么根据上面提出的febonacci有的性质,我们将mod的数拆成了多个素数幂的乘积,那么剩下的就是求G(2)和G(5),暴力就可以求出是3和20;

那么求每个模数下的循环节的长度,假设分别是
G(2)*28=512
G(5)*58=7812500

这样我们就可以得到两个同余方程组
在这里插入图片描述
然后可以套中国剩余定理(CRT)或者暴力也可以求出

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define rep(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
using namespace std;
const int N=1e5+10;
const int INF=0x3f3f3f3f;
const int MOD=1000000000;
const int P1=512;
const int P2=1953125;
const int M=7812500;
ll n,m;
ll f[7812500+1000],sum[M+1000];
ll epow(ll a,ll p){
    ll ans=1;
    while(p){
        if(p&1)
            ans=(ans*a)%MOD;
        a=(a*a)%MOD;
        p>>=1;
    }
    return ans;
}
ll get_ans(ll xun,ll p){
    return (n/xun*sum[xun-1]%p+sum[n%xun])%p;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    scanf("%lld%lld",&n,&m);
    f[1]=1;
    for(int i=2;i<=M;i++) f[i]=(f[i-1]+f[i-2])%MOD;
    for(int i=1;i<=M;i++) sum[i]=(sum[i-1]+epow(f[i],m))%MOD;
    ll ans1=get_ans(1ll*768,P1);
    ll ans2=get_ans(M,P2);
    for(ll i=ans1;i<=P1*P2;i+=P1){
        if(i%P2==ans2){
            printf("%lld\n",i);
            break;
        }
    }
    return 0;
}


发布了229 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/c___c18/article/details/100016291