Fibonacci数列的幂和 zoj 3774
题目大意:
求斐波那契数列前n项的k次幂和 Mod 1000000009。 n<=1e18, k<=1e5
这题的k比较大,所以不能用矩阵乘法来递推。学到了新姿势... http://blog.csdn.net/acdreamers/article/details/23039571
基本思想就是求出通项公式,把里面的$\sqrt{5}$ 用 $x$ 代替, 其中 $x^2\equiv 5\pmod{1000000009}$
然后二项式展开求和就好了。
一个合法的$x$是383008016。 正好前几天做了个高次剩余方程的题,直接拉过去跑出来。。
为什么这样替代是合法的呢? 网络上好像没找到严谨的证明。
下面给出我个人的不严谨证明:
将原式子合并之后最终会得到$\frac{P(t)}{Q(t)}$ 这样的形式。 其中$t=\sqrt{5}$ $P(t)$和$Q(t)$是关于$t$的多项式.
把$P(t)$ $Q(t)$中次数>=2的可以利用$t^2=5$降幂成次数不超过1的, 最后变成$\frac{P'(t)}{Q'(t)}$ 这样的形式.
由于最终答案一定是整数,所以 $Q'(t)$ 能整除 $P'(t)$ 。 设 $\frac{P'(t)}{Q'(t)}=K$
那么把$t$ 换成 上面求出的 $x$ 得到的 $\frac{P'(x)}{Q'(x)}$ 也是 $K$. 不影响答案。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cstdlib>
#include <set>
#include <queue>
using namespace std; #define X first
#define Y second
#define Mod 1000000009
#define N 100010
#define M 101 typedef long long ll; const int INF=<<;
const int sqrt5=;
int P,Q;
int fac[N],fac_inv[N]; int Power(int x,ll p)
{
int res=;
for (;p;p>>=)
{
if (p&) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
}
return res;
} int C(int n,int m)
{
if (m==) return ;
int res=1ll*fac[n]*fac_inv[m]%Mod;
return 1ll*res*fac_inv[n-m]%Mod;
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); P=1ll*(+sqrt5)*Power(,Mod-)%Mod;
Q=1ll*(-sqrt5)*Power(,Mod-)%Mod;
if (Q<) Q+=Mod;
fac[]=fac_inv[]=;
for (int i=;i<N;i++) fac[i]=1ll*fac[i-]*i%Mod,fac_inv[i]=Power(fac[i],Mod-);
int T,K,ans; ll n;
scanf("%d",&T);
while (T--)
{
scanf("%lld%d",&n,&K);
ans=;
for (int i=K,op=;i>=;i--,op=-op)
{
int tmp1=op*C(K,i),tmp2,x=1ll*Power(P,i)*Power(Q,K-i)%Mod;
if (x==) tmp2=n%Mod;
else tmp2=1ll*x*(Power(x,n)-)%Mod,tmp2=1ll*tmp2*Power(x-,Mod-)%Mod;
ans+=1ll*tmp1*tmp2%Mod;
ans%=Mod;
}
if (ans<) ans+=Mod;
ans=1ll*ans*Power(Power(sqrt5,Mod-),K)%Mod;
printf("%d\n",ans);
}
return ;
}
我的求高次剩余方程的代码(目前只会做模数是质数的情况...):
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1038
#include <cstdio>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std; #define X first
#define Y second
#define N 100010
#define M 5783
typedef long long ll;
typedef unsigned long long ull; const int Mod=; int prime[N];
bool flag[N];
vector<int> ans; int Power(int x,int p,int Mod)
{
int res=;
for (;p;p>>=)
{
if (p&) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
}
return res;
} bool Check(int g,int P,int a[])
{
for (int i=;i<=a[];i++) if (Power(g,(P-)/a[i],P)==) return false;
return true;
} int Find_Root(int P)
{
int x=P-,a[]; a[]=;
for (int i=;i<=prime[] && prime[i]*prime[i]<=x;i++)
{
if (x%prime[i]==)
{
a[++a[]]=prime[i];
while (x%prime[i]==) x/=prime[i];
}
}
if (x!=) a[++a[]]=x;
for (int i=;;i++) if (Check(i,P,a)) return i;
} vector<pair<int,int> > hash[M]; int Calc_Exp(int a,int b,int P) // 求解a^x=b (mod P)
{
int m=ceil(sqrt(P+0.5));
for (int i=;i<M;i++) hash[i].clear(); int v=Power(a,m,P),tmp=; v=Power(v,P-,P);
hash[].push_back(make_pair(,));
for (int i=;i<m;i++)
{
tmp=1ll*tmp*a%P;
hash[tmp%M].push_back(make_pair(tmp,i));
} for (int i=;i<m;i++)
{
int t=b%M;
for (int j=;j<hash[t].size();j++)
{
if (hash[t][j].X==b) return i*m+hash[t][j].Y;
}
b=1ll*b*v%P;
}
} void ex_gcd(ll a,ll b,ll &x,ll &y,ll &d)
{
if (!b)
{
d=a;
x=;
y=;
}
else
{
ex_gcd(b,a%b,y,x,d);
y-=a/b*x;
}
} //X^A = B (mod P)
void Solve_Equation(int A,int B,int P)
{
ans.clear();
int g=Find_Root(P); //求出P的原根
int b=Calc_Exp(g,B,P); // B=g^b
ll x,y,d;
ex_gcd(A,P-,x,y,d);
if (b%d==)
{
int del=(P-)/d,tmp,t;
x*=b/d;
x%=del;
if (x<) x+=del;
tmp=Power(g,(int)x,P);
t=Power(g,del,P);
while (x<=P-) ans.push_back(tmp),x+=del,tmp=1ll*tmp*t%P;
sort(ans.begin(),ans.end());
for (int i=;i<ans.size();i++) printf("%d%c",ans[i],i==ans.size()-? '\n':' ');
}
if (ans.size()==) printf("No Solution\n");
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); for (int i=;i<N;i++)
{
if (!flag[i]) prime[++prime[]]=i;
for (int j=;j<=prime[] && i*prime[j]<N;j++)
{
flag[i*prime[j]]=true;
if (i%prime[j]==) break;
}
} int T,A,B,P; scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&P,&A,&B);
Solve_Equation(A,B,P);
} return ;
}
可以扩展到模数不是质数的情况,等我学会了在写篇文章 记录具体做法吧。
Fibonacci数列的幂和 zoj 3774的更多相关文章
- ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 && 快速幂)(2015沈阳网赛1002题)
Problem Description The so-called best problem solver can easily solve this problem, with his/her ch ...
- 矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
1732 Fibonacci数列 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在“ ...
- 算法设计与分析 1.2 不一样的fibonacci数列 (矩阵快速幂思想)
题目描述 Winder 最近在学习 fibonacci 数列的相关知识.我们都知道 fibonacci 数列的递推公式是F(n) = F(n - 1) + F(n - 2)(n >= 2 且 n ...
- 矩阵乘法快速幂 codevs 1250 Fibonacci数列
codevs 1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1 ...
- 1250 Fibonacci数列(矩阵乘法快速幂)
1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, f ...
- fibonacci 数列及其应用
fibonacci 数列及其延展 fibonacci计算 fibonacci数列是指 0,1,1,2,3,5,8,13,21……这样自然数序列,即从第3项开始满足f(n)=f(n-1)+f(n-2): ...
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...
- 【蓝桥杯】入门训练 Fibonacci数列
入门训练 Fibonacci数列 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. ...
- hdu 5895 广义Fibonacci数列
Mathematician QSC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
随机推荐
- java实现发送邮件功能
项目中实现发送邮件功能,先书写一个小Demo,记录如下: POM.XML中导入依赖 <!-- start java 提供的支持邮件发送相关业务的类 --> <dependency&g ...
- Kubernetes DNS的配置
Kubernetes集群机制通过DNS进行服务名和ip的映射,如果没有配置dns,你可以通过下面命令查询到集群ip kubectl get svc --namespace=kube-system 得到 ...
- ISP图像调试工程师——3D和2D降噪(熟悉图像预处理和后处理技术)
2D降噪:只在2维空间域上进行降噪处理.基本方法:对一个像素将其与周围像素平均,平均后噪声降低,但缺点是会造成画面模糊,特别是物体边缘部分.因此对这种算法的改进主要是进行边缘检测,边缘部分的像素不用来 ...
- Yii2系列教程四:实现用户注册,验证,登录
上一篇写了一点点Yii2的数据库相关知识和强大的Gii,这一篇就如上一篇的最后所说的一样:在Yii2中实现用户的注册和登录. 你可以直接到Github下载源码,以便可以跟上进度,你也可以重头开始,一步 ...
- Dubbo超时重试机制带来的数据重复问题
Dubbo的超时重试机制为服务容错.服务稳定提供了比较好的框架支持,但是在一些比较特殊的网络环境下(网络传输慢,并发多)可能 由于服务响应慢,Dubbo自身的超时重试机制(服务端的处理时间超过了设定的 ...
- knowledgeroot 配置
首先下载 KnowledgeRoot 的安装包,就是一个压缩文件,解压缩后放到 WebRoot 下面 在浏览器中打开网站,自动提示进行安装,安装的过程很简单,安装结束后即可以使用. 安装包创建的数据库 ...
- [Angular] Angular Custom Change Detection with ChangeDetectorRef
Each component has its own ChangeDetectorRef, and we can inject ChangeDetectorRef into constructor: ...
- Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- ActiveMQ消息游标 --转载
转:http://blog.csdn.net/m13321169565/article/details/8081358 在Activemq以前的版本中,broker会把待发送的消息保存在内存中.这种方 ...
- css - margin-padding
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...