bzoj5104: Fib数列
Description
Input
一行,一个数字N,N < = 10^9+9
$r_1=\frac{1+\sqrt 5}{2}\\ r_2=\frac{1-\sqrt 5}{2}=-\frac{1}{r_1}\\ N=Fib_x=r_1^x-r_2^x\\ N^2=r_1^{2x}+r_2^{2x}-2(-1)^x\\ ±(r_1^x+r_2^x)=\sqrt{N^2+4(-1)^x}\\ \frac{N±\sqrt{N^2+4(-1)^x}}{2}=r_1^x,-r_2^x\\ x=min(log_{r_1}(\frac{N±\sqrt{N^2+4(-1)^x}}{2}),log_{r_2}(-\frac{N±\sqrt{N^2+4(-1)^x}}{2}))\\ 枚举x的奇偶,利用离散对数计算答案$
#include<cstdio>
typedef long long i64;
const int P=1e9+,g=,sqrt5=,I2=(P+)/,B=;
const int r1=(P++sqrt5)/,r2=(P+-sqrt5)/;
const int lr1=,lr2=;
inline int mul(int a,int b){return (i64)a*b%P;}
inline void muls(int&a,int b){a=mul(a,b);}
inline int fix(int x){return x+(x>>&P);}
int pw(int a,int n){
int v=;
for(;n;n>>=,muls(a,a))if(n&)muls(v,a);
return v;
}
void exgcd(int a,int b,int&x,int&y){
if(!b){x=,y=;return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int inv(int a,int b){
int x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int solve(int a,int b,int c,int tp){
if(!a)return b?-:-tp;
int g=gcd(a,c);
if(b%g)return -;
a/=g,b/=g,c/=g;
i64 t=(i64)b*inv(a,c)%c;
if(!t)t=c;
if(t%!=tp)t+=c;
return t%!=tp?-:t;
}
int h[][];
int&at(int x){
int w=x&;
while(h[w][]){
if(h[w][]==x)return h[w][];
w=(w+)&;
}
h[w][]=x;
return h[w][];
}
void pre(){
int v=;
for(int i=;i<B;++i){
at(v)=i+;
muls(v,g);
}
}
int log(int x){
int t=pw(g,P--B);
for(int i=;;i+=B){
int y=at(x);
if(y)return y-+i;
muls(x,t);
}
}
int sqrt(int x){
int t=log(x);
return t&?-:pw(g,t/);
}
int ans=-;
void upd(int v){
if(~v&&(v<ans||ans==-))ans=v;
}
void cal(int x,int tp){
upd(solve(lr1,log(x),P-,tp));
upd(solve(lr2,log(fix(-x)),P-,tp));
}
int main(){
pre();
int v;
scanf("%d",&v);
if(!v)return puts("-1"),;
muls(v,sqrt5);
int v2=mul(v,v);
int s1=sqrt(fix(v2-)),s2=sqrt(fix(v2+-P));
if(~s1){
cal(mul(fix(v+s1-P),I2),);
cal(mul(fix(v-s1),I2),);
}
if(~s2){
cal(mul(fix(v+s2-P),I2),);
cal(mul(fix(v-s2),I2),);
}
return printf("%d\n",ans),;
}
bzoj5104: Fib数列的更多相关文章
- BZOJ5104 Fib数列(二次剩余+BSGS)
5在1e9+9下有二次剩余,那么fib的通项公式就有用了. 已知Fn,求n.注意到[(1+√5)/2]·[(1-√5)/2]=-1,于是换元,设t=[(1+√5)/2]n,原式变为√5·Fn=t-(- ...
- BZOJ5104 Fib数列 二次剩余、BSGS
传送门 发现只有通项公式可以解决考虑通项公式 \(F_n = \frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^ ...
- bzoj5104 Fib数列(BSGS+二次剩余)
快AFO了才第一次写二次剩余的题…… 显然应该将Fn写成通项公式(具体是什么写起来不方便而且大家也都知道),设t=((1+√5)/2)n,T=√5N,然后可以得到t-(-1)t/t=√5N,两边同时乘 ...
- 【BZOJ5104】Fib数列(BSGS,二次剩余)
[BZOJ5104]Fib数列(BSGS,二次剩余) 题面 BZOJ 题解 首先求出斐波那契数列的通项: 令\(A=\frac{1+\sqrt 5}{2},B=\frac{1-\sqrt 5}{2}\ ...
- FIB数列
斐波那契级数除以N会出现循环,此周期称为皮萨诺周期. 下面给出证明 必然会出现循环 这是基于下面事实: 1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+ ...
- 动态规划之Fib数列类问题应用
一,问题描述 有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶.走到N阶楼梯,一共有多少种走法? 二,问题分析 DP之自顶向下分析方式: 爬到第N阶楼梯,一共只有三种情况(全划分,加法原 ...
- UVaLive 3357 Pinary (Fib数列+递归)
题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...
- 【bzoj5118】Fib数列2 费马小定理+矩阵乘法
题目描述 Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2) 现给出N,求Fib(2^n). 输入 本题有多组数据.第一行一个整数T,表示数据 ...
- HDU3977 Evil teacher 求fib数列模p的最小循环节
In the math class, the evil teacher gave you one unprecedented problem! Here f(n) is the n-th fibona ...
随机推荐
- 微信小程序:POST请求data数据请求不到
最近开始开发小程序,遇到许多小问题,直奔主题. wx.request()是微信封装的ajax请求方法,也是小程序中ajax唯一的一个方法,被放在了API文档的第一个位置,的确使用率是最高的. 但是wx ...
- mount语法
一.简单用法 $ mount /dev/hda2 /home第一个叁数是与包括文件系统的磁盘或分区相关的设备文件.第二个叁数是要mount到的目录. $ umount /dev/hda2$ umoun ...
- WebService中用CXF框架的wsdl部署生成客户端代码时,使用cmd命令口出现wsimport不是内部或外部命令的问题
网上有很多,都不好用,这个立竿见影的 set JAVA_HOME = *:\Program Files\Java\jdk1.8.0_181(此处为自己jdk的安装路径) set CLASSPATH = ...
- 帝国cms中下拉框select的绑定
在修改数据模型中,将下拉框的表示代码换成下: 将id换成自己的id地址.数据库查询中的classid换成自己创建栏目的id. <select name="diqu" id=& ...
- sql 双表或多表的连接查询 join
使用 inner join,left join, right join.full join 对双表进行联合查询. 1.inner join.join:如果表中有至少一个匹配,则返回行. 2.left ...
- ArrayList、LinkedList和vector的区别
1.ArrayList和Vector都是数组存储,插入数据涉及到数组元素移动等操作,所以比较慢,因为有下标,所以查找起来非常的快. LinkedList是双向链表存储,插入时只需要记录本项的前后项,查 ...
- 科学计算库Numpy(1)
Numpy 一,数据结构 数据类型: ndarray import numpy world_alchol = numpy.genfromtxt('world_alchol.txt',delimiter ...
- Git入门(安装及基础命令行操作)
一.安装 1.Mac 在Mac中安装Git的方法不止一种.最简单的要数通过Xcode命令行工具.对于Mavericks(10.9)或更高版本的操作系统,当你第一次尝试在终端执行git命令时,系统会自动 ...
- SpringSecurity身份验证基础入门
对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.Spring Security). pom.xm ...
- Git 几个常用操作
git init -- 初始化仓库, git clone -- 从远端克隆仓库到本地 git status -- 查看git仓库的状态 git log ...