Description

Fib数列为1,1,2,3,5,8...
求在Mod10^9+9的意义下,数字N在Fib数列中出现在哪个位置
无解输出-1

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数列的更多相关文章

  1. BZOJ5104 Fib数列(二次剩余+BSGS)

    5在1e9+9下有二次剩余,那么fib的通项公式就有用了. 已知Fn,求n.注意到[(1+√5)/2]·[(1-√5)/2]=-1,于是换元,设t=[(1+√5)/2]n,原式变为√5·Fn=t-(- ...

  2. BZOJ5104 Fib数列 二次剩余、BSGS

    传送门 发现只有通项公式可以解决考虑通项公式 \(F_n = \frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})^n - (\frac{1-\sqrt{5}}{2})^ ...

  3. bzoj5104 Fib数列(BSGS+二次剩余)

    快AFO了才第一次写二次剩余的题…… 显然应该将Fn写成通项公式(具体是什么写起来不方便而且大家也都知道),设t=((1+√5)/2)n,T=√5N,然后可以得到t-(-1)t/t=√5N,两边同时乘 ...

  4. 【BZOJ5104】Fib数列(BSGS,二次剩余)

    [BZOJ5104]Fib数列(BSGS,二次剩余) 题面 BZOJ 题解 首先求出斐波那契数列的通项: 令\(A=\frac{1+\sqrt 5}{2},B=\frac{1-\sqrt 5}{2}\ ...

  5. FIB数列

    斐波那契级数除以N会出现循环,此周期称为皮萨诺周期. 下面给出证明 必然会出现循环 这是基于下面事实: 1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+ ...

  6. 动态规划之Fib数列类问题应用

    一,问题描述 有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶.走到N阶楼梯,一共有多少种走法? 二,问题分析 DP之自顶向下分析方式: 爬到第N阶楼梯,一共只有三种情况(全划分,加法原 ...

  7. UVaLive 3357 Pinary (Fib数列+递归)

    题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...

  8. 【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,表示数据 ...

  9. 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 ...

随机推荐

  1. [Leetcode]27. 移除元素

    题目描述: ++难度:简单++ 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 ...

  2. wpf 依赖属性介绍

    微软在wpf中推出le 附加属性 这个新概念 简单来说,本来自己这个类是不具备该行为,但是在特殊情况下需要用到该属性 比如在 TextBox 本来是不具备,几行几列 跨行等 行为 ,但是如果  把他放 ...

  3. 清华机试中手机键盘问题求解 java 和 c

    题目描述:按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次.如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需 ...

  4. jquery 上滑加载更多

    $(document).ready(function() { var totalPage = {$totalPage};//总页数 var page = {$page}; //起始页 var page ...

  5. AI五子棋需求规格说明书

    AI-Gobang AI五子棋小程序 github地址:https://github.com/holidaysss/AI-Gobang 程序简介 AlphaGo Zero在世界舞台上取得的巨大成功体现 ...

  6. ubuntu 16.04 编译安装 amule (开启GUI)

    安装依赖 $ -dev libgeoip-dev zlib1g-dev libupnp-dev libboost-all-dev libwxbase3.-dev libwxgtk3.-dev buil ...

  7. 爱因斯坦求和约定 (Einstein summation convention)

  8. python 12

    #! /usr/bin/python a = 1 b = [2, 3] def func(): a = 2 print("in func a:", a) b[0] = 1 prin ...

  9. 日常遇错之Unable to save settings: Failed to save settings. Please restart PyCharm

    将工程的.ideas目录删掉,重启pycharm即可.

  10. Map的嵌套 练习

    Map的嵌套   练习 利用迭代和增强for循环的两种方式实现如下效果 package cn.ccc; import java.util.HashMap;import java.util.Iterat ...