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的奇偶,利用离散对数计算答案$

  1. #include<cstdio>
  2. typedef long long i64;
  3. const int P=1e9+,g=,sqrt5=,I2=(P+)/,B=;
  4. const int r1=(P++sqrt5)/,r2=(P+-sqrt5)/;
  5. const int lr1=,lr2=;
  6. inline int mul(int a,int b){return (i64)a*b%P;}
  7. inline void muls(int&a,int b){a=mul(a,b);}
  8. inline int fix(int x){return x+(x>>&P);}
  9. int pw(int a,int n){
  10. int v=;
  11. for(;n;n>>=,muls(a,a))if(n&)muls(v,a);
  12. return v;
  13. }
  14. void exgcd(int a,int b,int&x,int&y){
  15. if(!b){x=,y=;return;}
  16. exgcd(b,a%b,y,x);
  17. y-=a/b*x;
  18. }
  19. int inv(int a,int b){
  20. int x,y;
  21. exgcd(a,b,x,y);
  22. return (x%b+b)%b;
  23. }
  24. int gcd(int a,int b){return b?gcd(b,a%b):a;}
  25. int solve(int a,int b,int c,int tp){
  26. if(!a)return b?-:-tp;
  27. int g=gcd(a,c);
  28. if(b%g)return -;
  29. a/=g,b/=g,c/=g;
  30. i64 t=(i64)b*inv(a,c)%c;
  31. if(!t)t=c;
  32. if(t%!=tp)t+=c;
  33. return t%!=tp?-:t;
  34. }
  35. int h[][];
  36. int&at(int x){
  37. int w=x&;
  38. while(h[w][]){
  39. if(h[w][]==x)return h[w][];
  40. w=(w+)&;
  41. }
  42. h[w][]=x;
  43. return h[w][];
  44. }
  45. void pre(){
  46. int v=;
  47. for(int i=;i<B;++i){
  48. at(v)=i+;
  49. muls(v,g);
  50. }
  51. }
  52. int log(int x){
  53. int t=pw(g,P--B);
  54. for(int i=;;i+=B){
  55. int y=at(x);
  56. if(y)return y-+i;
  57. muls(x,t);
  58. }
  59. }
  60. int sqrt(int x){
  61. int t=log(x);
  62. return t&?-:pw(g,t/);
  63. }
  64. int ans=-;
  65. void upd(int v){
  66. if(~v&&(v<ans||ans==-))ans=v;
  67. }
  68. void cal(int x,int tp){
  69. upd(solve(lr1,log(x),P-,tp));
  70. upd(solve(lr2,log(fix(-x)),P-,tp));
  71. }
  72. int main(){
  73. pre();
  74. int v;
  75. scanf("%d",&v);
  76. if(!v)return puts("-1"),;
  77. muls(v,sqrt5);
  78. int v2=mul(v,v);
  79. int s1=sqrt(fix(v2-)),s2=sqrt(fix(v2+-P));
  80. if(~s1){
  81. cal(mul(fix(v+s1-P),I2),);
  82. cal(mul(fix(v-s1),I2),);
  83. }
  84. if(~s2){
  85. cal(mul(fix(v+s2-P),I2),);
  86. cal(mul(fix(v-s2),I2),);
  87. }
  88. return printf("%d\n",ans),;
  89. }

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. ubuntu配置neuwork网络

    ubuntu 网络配置 检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. ...

  2. Github远程仓库提交代码步骤

    1.克隆远程仓库     1)当没有设置默认目录时         git clone 仓库地址 本地存放目录 //没有目录的情况    2)当设置了本地存放目录时         先打开路径,命令: ...

  3. Python多进程并发(multiprocessing)

    1.新建单一进程 如果我们新建少量进程,可以如下: 2.使用进程池 是的,你没有看错,不是线程池.它可以让你跑满多核CPU,而且使用方法非常简单. 注意要用apply_async,如果落下async, ...

  4. java.lang.NullPointerException错误的解决方案

    java.lang.NullPointerException空指针异常是像我一样新手很容易出现的问题,这个问题一般情况都是不细心的时候出现的,开始正文如下: 1.业务层面的错误: a.没有写非空验证: ...

  5. Ubuntu 16.04 环境下配置apache2.4 + php5.6

    相信用惯了Windows的朋友一开始接触Linux是很崩溃的,因为很多东西都是通过命令行来完成的,包括安装绝大多数的开发工具以及环境,那么在Ubuntu下其实可以直接通过apt-get指令来安装apa ...

  6. UVa——1600(巡逻机器人)

    迷宫求最短路的话一般用bfs都可以解决,但是这个加了个状态,那么就增加一个维度,用来判断k的值.比较简单的三维bfs.写搜索题的话一定要注意细节.这个题花了好长的时间.因为k的原因,一开始用了k的原因 ...

  7. complex类的设计实现

    #include <iostream> #include <cmath> using namespace std; class Complex{ ,); Complex(Com ...

  8. Java基于opencv—归一化

    Opencv中提供了resize函数,可以把图像调整到相同大小 Java中resize函数的声明,内部调用的都是native方法 public static void resize(Mat src, ...

  9. SQL Server信息偏差影响表联结方式统计

    SQL Server统计信息偏差影响表联结方式案例浅析   我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适 ...

  10. AssetBundle打包-----BuildPipeline的应用

    打包思路:确定要打包资源的路径.和打包的输出路径(一般为S路径),把存放资源的路径使用递归进行遍历,获取所有资源,文件类型的资源可以通过File拷贝或IO写到输出路径,其他资源的打包通过AssetBu ...