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 ...
随机推荐
- ubuntu配置neuwork网络
ubuntu 网络配置 检查网络配置命令:ifconfig 一.通过配置文件配置 新手没怎么用过Ubuntu,所以走了不少弯路,网上找了很多方法,大都没对我起到帮助作用,所以把自己的配置方法写一写. ...
- Github远程仓库提交代码步骤
1.克隆远程仓库 1)当没有设置默认目录时 git clone 仓库地址 本地存放目录 //没有目录的情况 2)当设置了本地存放目录时 先打开路径,命令: ...
- Python多进程并发(multiprocessing)
1.新建单一进程 如果我们新建少量进程,可以如下: 2.使用进程池 是的,你没有看错,不是线程池.它可以让你跑满多核CPU,而且使用方法非常简单. 注意要用apply_async,如果落下async, ...
- java.lang.NullPointerException错误的解决方案
java.lang.NullPointerException空指针异常是像我一样新手很容易出现的问题,这个问题一般情况都是不细心的时候出现的,开始正文如下: 1.业务层面的错误: a.没有写非空验证: ...
- Ubuntu 16.04 环境下配置apache2.4 + php5.6
相信用惯了Windows的朋友一开始接触Linux是很崩溃的,因为很多东西都是通过命令行来完成的,包括安装绝大多数的开发工具以及环境,那么在Ubuntu下其实可以直接通过apt-get指令来安装apa ...
- UVa——1600(巡逻机器人)
迷宫求最短路的话一般用bfs都可以解决,但是这个加了个状态,那么就增加一个维度,用来判断k的值.比较简单的三维bfs.写搜索题的话一定要注意细节.这个题花了好长的时间.因为k的原因,一开始用了k的原因 ...
- complex类的设计实现
#include <iostream> #include <cmath> using namespace std; class Complex{ ,); Complex(Com ...
- Java基于opencv—归一化
Opencv中提供了resize函数,可以把图像调整到相同大小 Java中resize函数的声明,内部调用的都是native方法 public static void resize(Mat src, ...
- SQL Server信息偏差影响表联结方式统计
SQL Server统计信息偏差影响表联结方式案例浅析 我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适 ...
- AssetBundle打包-----BuildPipeline的应用
打包思路:确定要打包资源的路径.和打包的输出路径(一般为S路径),把存放资源的路径使用递归进行遍历,获取所有资源,文件类型的资源可以通过File拷贝或IO写到输出路径,其他资源的打包通过AssetBu ...