HDU 6755 Fibonacci Sum

Fibonacci Sum

问题:

f[0]=0,f[1]=1;
给 0<=n,c,k<=1e18 ,求f[0]^k+f[c]^k+f[2c]^k+....+f[nc]^k%(1e9+9);

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6755

这道题一开始想到的就是矩阵快速幂,但是k处理不了

因为fib还有一个数学式子求法。而他就是这道题的突破口。

具体讲解:https://blog.csdn.net/acdreamers/article/details/23039571

上述blog题目要求与本道题最大的差别就是我们多了一个c,其余的都是一样的,那把他的代码改一下就好了。将a变成a^c,b变成b^c。

就把c消去了,然后f[0]为0,k次方还是为0,基本就跟原题一样了。下面是AC代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 100005;
const LL MOD = 1000000009;
LL fac[N],A[N],B[N];
LL fa=691504013,fb=308495997;
void Init(LL k)
{

    int nm=k;
    A[0] = B[0] = 1;
    for(int i=1; i<=nm; i++)
    {
        A[i] = A[i-1] * fa % MOD;
        B[i] = B[i-1] * fb % MOD;
    }
}
LL quick_mod(LL a,LL b,LL MOD)
{
    LL ans = 1;
    a %= MOD;
    while(b)
    {
        if(b & 1)
        {
            ans = ans * a % MOD;
            b--;
        }
        b >>= 1;
        a = a * a % MOD;
    }
    return ans;
}
LL Solve(LL n,LL k)
{
    LL ans = 0;
    for(int r=0; r<=k; r++)
    {
        LL t = A[k-r] * B[r] % MOD;
        LL x = fac[k];
        LL y = fac[k-r] * fac[r] % MOD;
        LL c = x * quick_mod(y,MOD-2,MOD) % MOD;
        LL tmp = t * (quick_mod(t,n,MOD) - 1) % MOD * quick_mod(t-1,MOD-2,MOD) % MOD;
        if(t == 1) tmp = n % MOD;
        tmp = tmp * c % MOD;
        if(r & 1) ans -= tmp;
        else      ans += tmp;
        ans %= MOD;
    }
    LL m = quick_mod(383008016,MOD-2,MOD);
    ans = ans * quick_mod(m,k,MOD) % MOD;
    ans = (ans % MOD + MOD) % MOD;
    return ans;
}
int main()
{
    int T;
    LL n,k,c;
    fac[0] = 1;
    for(int i=1; i<N; i++)
        fac[i] = fac[i-1] * i % MOD;
    scanf("%d",&T);
    while(T--)
    {
        cin>>n>>c>>k;
        fa=691504013;
        fb=308495997;
        fa=quick_mod(fa,c,MOD);
        fb=quick_mod(fb,c,MOD);
        Init(k);
        cout<<Solve(n,k)<<endl;
    }
    return 0;
}

 

posted @ 2020-07-22 23:13  Grisaia  阅读(68)  评论(0)    收藏  举报