ZOJ-3774 Power of Fibonacci——等比数列求和&&等价替换
题目
求 $\displaystyle \sum_{i=1}^n F_i^k$,($1 \leq n\leq 10^{18},1 \leq k\leq 10^5$),答案对 $10^9+9$ 取模。
分析
将通项公式 $fib_i = \frac{1}{\sqrt{5}} ((\frac{1 + \sqrt{5}}{2})^i - (\frac{1 - \sqrt{5}}{2})^i)$ 代入,可以得到
$$\begin{align*} S & = (\frac{1}{\sqrt{5}})^k \sum\limits_{i=1}^n ((\frac{1 + \sqrt{5}}{2})^i - (\frac{1 - \sqrt{5}}{2}) ^ i)^k \\ & = (\frac{1}{\sqrt{5}})^k \sum\limits_{i=1}^n \sum\limits_{j=0}^k (-1)^{k-j} \binom{k}{j}(\frac{1 + \sqrt{5}}{2})^{ij} (\frac{1 - \sqrt{5}}{2})^{i(k-j)} \\ &= (\frac{1}{\sqrt{5}})^k \sum\limits_{j=0}^k (-1)^{k-j} \binom{k}{j} \sum\limits_{i=1}^n [(\frac{1 + \sqrt{5}}{2})^{j} (\frac{1 - \sqrt{5}}{2})^{k-j}]^i \\ &= (\frac{1}{\sqrt{5}})^k \sum\limits_{j=0}^k (-1)^{k-j} \binom{k}{j} (\frac{t^{n+1} - t}{t-1})
\end{align*}$$
因为 $x^2 \equiv 5(mod \ p)$,最终结果不含 $\sqrt 5$, 肯定是被平方了,所以可以用 $x$ 代替 $\sqrt 5$。
因为5在模 $10^9+9$意义下有二次剩余,所以 $\sqrt 5$ 有实际意义,那么我们可以从小到大枚举 $j$,后面那一部分是等比数列求和,注意特判公比为1.
如果5在某些模数下没有二次剩余,因为 $a \sqrt 5 + b% 在上述需要的运算(加、减、乘、除和幂)中是封闭的,所有我们可以用 $pair(a, b)$ 表示 $a \sqrt 5 + b$,并进行运算。
#include<bits/stdc++.h>
using namespace std; #define int long long
inline int read(){
int a = ;
char c = getchar();
bool f = ;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = ;
c = getchar();
}
if(c == EOF)
exit();
while(isdigit(c)){
a = a * + c - ;
c = getchar();
}
return f ? -a : a;
} const int MOD = 1e9 + , INV2 = (MOD + ) >> ; //2*(p+1)/2=1
int n, k; template < class T >
T poww(T a , int b){
T times = ;
while(b){
if(b & ) times = times * a % MOD;
a = a * a % MOD;
b >>= ;
}
return times;
} struct PII{
int st , nd;
PII(int _st = , int _nd = ) : st(_st) , nd(_nd){}
PII operator =(int b){return *this = PII(b , );}
bool operator !=(PII a){return st != a.st || nd != a.nd;}
};
PII operator +(PII a , PII b){return PII((a.st + b.st) % MOD , (a.nd + b.nd) % MOD);}
PII operator -(PII a , PII b){return PII((a.st + MOD - b.st) % MOD , (a.nd + MOD - b.nd) % MOD);}
PII operator *(PII a , PII b){return PII((a.st * b.st + * a.nd * b.nd) % MOD , (a.st * b.nd + a.nd * b.st) % MOD);}
PII operator *(PII a , int b){return PII(a.st * b % MOD , a.nd * b % MOD);}
PII operator %(PII a , int b){return a;}
PII operator /(PII a , PII b){return a * PII(b.st , MOD - b.nd) * poww((b.st * b.st - * b.nd * b.nd % MOD + MOD) % MOD , MOD - );} int solve(int x , int k){
PII all( , );
int C = , sgn = poww(MOD - , k);
for(int j = ; j <= k ; ++j){
PII cur = poww(PII(INV2 , INV2) , j) * poww(PII(INV2 , MOD - INV2) , k - j);
if(cur != PII( , ))
all = all + (poww(cur , x + ) - cur) / (cur - PII( , )) * sgn * C;
else
all = all + PII(x % MOD , ) * sgn * C;
C = C * (k - j) % MOD * poww(j + , MOD - ) % MOD;
sgn = sgn * (MOD - ) % MOD;
}
all = all * poww(PII( , poww(5LL , MOD - )) , k); //模板要求poww的参数类型相同
return all.st;
} signed main(){
for(int T = read() ; T ; --T){
n = read(); k = read();
printf("%lld\n" , solve(n , k));
}
return ;
}
参考链接:https://www.cnblogs.com/Itst/p/10735935.html
ZOJ-3774 Power of Fibonacci——等比数列求和&&等价替换的更多相关文章
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
Power of Fibonacci Time Limit: 5 Seconds Memory Limit: 65536 KB In mathematics, Fibonacci numbe ...
- Power of Matrix 等比数列求和 矩阵版!
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...
- hdu 1588(Fibonacci矩阵求和)
题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...
- [hdu 4959]Poor Akagi 数论(卢卡斯数,二次域运算,等比数列求和)
Poor Akagi Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- POJ 1845 (约数和+二分等比数列求和)
题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...
- 2014 Super Training #7 F Power of Fibonacci --数学+逆元+快速幂
原题:ZOJ 3774 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3774 --------------------- ...
- hoj3152-Dice 等比数列求和取模
http://acm.hit.edu.cn/hoj/problem/view?id=3152 Dice My Tags (Edit) Source : Time limit : sec Memory ...
- ZOJ3774 Power of Fibonacci 斐波那契、二项式定理
传送门--Vjudge 要求\(S = \sum\limits_{i=1}^n fib_i^k \mod 10^9+9\) 将通项公式\(fib_i = \frac{1}{\sqrt{5}} ((\f ...
- luogu1397 [NOI2013]矩阵游戏 (等比数列求和)
一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...
随机推荐
- Fiddler使其在HttpURLConnection下正常抓包
像陌陌这样使用HttpURLConnection进行通讯的APP还是无能为力 还需要对fiddler进行如下设置: 点击"Rules->CustomizeRules"; 在这 ...
- mysql创建唯一索引UNIQUE INDEX,以及报错“#失败原因: [Execute: Duplicate entry '733186700' for key 'uniq_video_id_index']”
要给t_video_prods表的video_id字段创建唯一所以,可以使用下面这条语句: alter table t_video_prods add UNIQUE INDEX `uniq_video ...
- 案例(2)-- 线程不安全对象(SimpleDateFormat)
问题描述: 1.系统偶发性抛出异常:java.lang.NumberFormatException: multiple points ,追溯源头抛出的类为:SimpleDateFormat 问题的定位 ...
- service mc_start.sh does not support chkconfig
在构建docker镜像时,编写Dockerfile构建镜像时,配置自启动脚本报错,service mc_start.sh does not support chkconfig 添加下面两句到 #!/b ...
- POJ1222、POJ3279、POJ1753--Flip
POJ1222-EXTENDED LIGHTS OUT POJ3279-Fliptile POJ1753-Flip Game 为什么将着三个题放一起讲呢?因为只要搞明白了其中一点,就可以一次3ac了- ...
- js同时获取多个共同class内容标签内容集合
1.获取标签内容 标签如下: <img image-code="#qq_1_gif#" class="emoji_icon" src="i ...
- tree 树形加载及增删改
//异步1<template> <div class="addequipment org"> <div class="top"&g ...
- ping IP 带时间戳循环显示并写入日志(windos版+linux版)
在工作中,判断网络是否通畅,首选命令就是ping,但有时候我们需要持续ping一个或多个地址时,需要加 -t 即可,但有时候需要在ping的时候加入时间戳并把ping记录写入到日志里面,方法如下: w ...
- MVC-路由(Route)
1.启用路由前的准备工作 Global.asax.cs中注册路由 public class MvcApplication : System.Web.HttpApplication { protecte ...
- Android笔记(十九) Android中的Fragment
通常我们使用Activity来展示界面,但是在手机上界面可能显示的很好看,但在平板上,因为平板的屏幕非常大,手机的界面放在平板上可能会出现控件被拉长.控件之间间距变大等问题.为了更好的体验效果,在Ac ...