BZOJ 5104
这个模数比较有趣
可以求出 $\sqrt{5}$
然后就可以做了
$f_n=\dfrac{\sqrt{5}}{5}[(\dfrac{\sqrt{5}+1}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n]$
分正负号考虑
令 $A=\dfrac{\sqrt{5}+1}{2},B=\dfrac{\sqrt{5}-1}{2}$
那么 $AB=1$
要解 $A^n+\dfrac{1}{A^n}=C$
令 $x=A^n$
那么 $x+\dfrac{1}{x}=C$
$x=\dfrac{c\pm \sqrt{c^2-4}}{2}$
再解一下 $n$
还有 Claris 提出的方法
$f_{n-1} f_{n+1} - f_n^2 = (-1)^n$
就可以求出 $f_{n+1}$ 从而通过矩阵的bsgs来求 $n$
以下代码是我的做法的,Claris的做法先坑着
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define dbg(x) cerr<<#x" = "<<x<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define Es(x,i) for(Edge*i=G[x];i;i=i->nxt)
typedef long long ll;
typedef pair<int,int> pii;
const int inf=~0u>>1,MOD=1e9+9;
inline int rd() {
int x,c,f=1;while(!isdigit(c=getchar()))f=c!='-';x=c-'0';
while(isdigit(c=getchar()))x=x*10+c-'0';return f?x:-x;
}
inline int pw(int n,int m){int r=1;for(;m;m>>=1,n=(ll)n*n%MOD)if(m&1)r=(ll)r*n%MOD;return r;}
/*
sqrt(5)=
383008016
616991993
*/
#define Inv(i) pw((i),MOD-2)
const int t5=616991993,i5=Inv(5),i2=Inv(2),it5=Inv(t5),g=13;
const int A=(t5+1)/2,B=(t5-1)/2;
int C;
int bsgs(int G,int Q){
static const int S=ceil(sqrt(MOD)+1);
map<int,int> F;
int t=Q;F[Q]=0;
rep(i,1,S){
t=(ll)t*G%MOD;
if(!F.count(t))F[t]=i;
}
t=pw(G,S);int q=1;
rep(i,1,S){
q=(ll)q*t%MOD;
if(F.count(q)){
return i*S-F[q];
}
}
return -1;
}
int F(int Q){
int t=pw(Q,MOD>>1);
if(t==-1)return -1;
else if(!t){
return 0;
}else{
t=bsgs(g,Q);
if(t==-1)return -1;
return pw(g,t/2);
}
}
inline int Calc(int t){
int q=1ll*t5*i5%MOD;
int p=(pw(A,t)+(t%2?1:-1)*pw(B,t))%MOD;
if(p<0)p+=MOD;p=(ll)p*q%MOD;
return p;
}
int ans=inf,AA;
inline void Upd(int C){
C%=MOD-1;
if(C<0)C+=MOD-1;
if(Calc(C)==AA)ans=min(ans,C);
}
int main(){
AA=C=rd();
C=(ll)C*t5%MOD;
{
int Q=((ll)C*C-4)%MOD;
if(Q<0)Q+=MOD;
int R=F(Q);
if(~R){
int a=(ll)(C+(R))%MOD*i2%MOD;
if(a<0)a+=MOD;
int b=bsgs(A,a);
if(~b)Upd(b);
a=(ll)(C-(R))%MOD*i2%MOD;
if(a<0)a+=MOD;
b=bsgs(A,a);
if(~b)Upd(b);
}
}
nxt:
{
int Q=((ll)C*C+4)%MOD;
if(Q<0)Q+=MOD;
int R=F(Q);
if(~R){
int a=(ll)(C+(R))%MOD*i2%MOD;
if(a<0)a+=MOD;
int b=bsgs(A,a);
if(~b)Upd(b);
a=(ll)(C-(R))%MOD*i2%MOD;
if(a<0)a+=MOD;
b=bsgs(A,a);
if(~b)Upd(b);
}
}
nxt2:
if(ans!=inf)cout<<ans<<endl;
else cout<<-1<<endl;
//cerr<<clock()<<endl;
}
BZOJ 5104的更多相关文章
- BZOJ 5104 Fib数列(二次剩余+BSGS)
斐波那契数列的通项: \[\frac{1}{\sqrt{5}}((\frac{1+\sqrt{5}}{2})-(\frac{1-\sqrt{5}}{2}))\] 设T=\(\sqrt{5}*N\),\ ...
- @bzoj - 5104@ Fib数列
目录 @description@ @solution@ @accepted code@ @details@ @description@ Fib数列为1,1,2,3,5,8... 求在Mod10^9+9 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- echarts 修改y轴name的样式
option = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sa ...
- python dic字典使用
#!/usr/bin/env python -*-''' 字典的基本组成及用法: dict={key:value} dict[key]=value 字典是无序的. key值是唯一属性,一对一,几个ke ...
- php运行出现Call to undefined function curl_init()解决方法
php运行出现Call to undefined function curl_init() 64位win7/8 下PHP不支持CURL 除了将PHP.ini中的;extension=php_curl. ...
- 编写高质量的Python代码系列(一)之用Pythonic方式来思考
Python开发者用Pythonic这个形容词来描述具有特定风格的代码.这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯.那么,如何以改风格完成常见的Python编程工作呢 ...
- 为什么wait()方法要放在同步块
回顾一下,如果wait()方法不在同步块中,代码的确会抛出异常: public class WaitInSyncBlockTest { @Test public void test() { try { ...
- js常用数据类型(Number,String,undefined,boolean) 引用类型( function,object,null ),其他数据类型( 数组Array,时间Date,正则RegExp ),数组与对象的使用
js常用数据类型 数字类型 | 字符串类型 | 未定义类型 | 布尔类型 typeof()函数查看变量类型 数字类型 Number var a1 = 10; var a2 = 3.66; conso ...
- 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
一. 背景 上一个章节,介绍了EF调用两类SQL语句,主要是借助 ExecuteSqlCommand 和 SqlQuery 两个方法来完成,在本章节主要是复习几类存储过程的写法和对应的EF调用这几类 ...
- django - 总结 - 用户认证组件
用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...
- java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or.....
1,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dia ...
- Existing lock /var/run/yum.pid: another copy is running as pid 解决办法
yum只能支持一个例程运行,所以如果有一个例程已经在运行,其他的必须等待该进程退出释放lock.出现这种情况时,可以用以下命令来恢复: rm -f /var/run/yum.pid