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; }

浙公网安备 33010602011771号