题意

定义 $F_n$ 为

$$F_n = \left\{\begin{matrix}
0, n=0\\
1, n=1 \\
F_{n-1} + F_{n-2}, n > 1
\end{matrix}\right.$$

现给你一个素数 $p$ 和一个非负整数 $C$,你需要最小的非负整数 $n$,使得 $F_n \equiv C (mod \ p)$.

分析

因为题目保证 $p \ mod \ 10$ 是一个完全平方数,也就是说 $p \ mod \ 5$ 等于1或-1,即5是模$p$ 的二次剩余(据说)。

求出通项,用Cipolla求出5的二次剩余,记为 $c$,并记 $p = \frac{1+c}{2}$,

通项变成

$${1\over c}\left(p^n-(-1)^n{1\over p^n}\right)\equiv a\pmod{P}$$

解得

$$p^n\equiv {ac\pm \sqrt{ac+4(-1)^n}\over 2}$$

然后枚举一下 $n$ 的奇偶性,再用BSGS求出 $n$就可以了。

//我原来的模板好像有问题,这里贴大佬的模板

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x7fffffff
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
using namespace std;
char buf[<<],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,,<<,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=;R char ch;
while((ch=getc())>''||ch<'')(ch=='-')&&(f=-);
for(res=ch-'';(ch=getc())>=''&&ch<='';res=res*+ch-'');
return res*f;
}
char sr[<<],z[];int C=-,Z=;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
void print(R int x){
if(C><<)Ot();if(x<)sr[++C]='-',x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int P;
inline int add(R int x,R int y){return 0ll+x+y>=P?0ll+x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=;
for(;y;y>>=,x=mul(x,x))(y&)?res=mul(res,x):;
return res;
}
int w,a;
struct cp{
int x,y;
inline cp(R int _x,R int _y):x(_x),y(_y){}
inline cp operator *(const cp &b)const{
return cp(add(mul(x,b.x),mul(w,mul(y,b.y))),add(mul(x,b.y),mul(y,b.x)));
}
};
int ksm(R cp x,R int y){
R cp res(,);
for(;y;y>>=,x=x*x)if(y&)res=res*x;
return res.x;
}
int Sqrt(int x){
if(!x)return ;
if(ksm(x,(P-)>>)==P-)return -;
while(true){
a=mul(rand(),rand()),w=dec(mul(a,a),x);
if(ksm(w,(P-)>>)==P-)return ksm(cp(a,),(P+)>>);
}
}
const int N=;
struct Hash{
struct eg{int v,nx,w;}e[N];int head[N],tot;
inline void clr(){memset(head,,sizeof(head)),tot=;}
inline void add(R int v,R int w){e[++tot]={v,head[v&],w},head[v&]=tot;}
int query(int x){
go(x&)if(v==x)return e[i].w;
return -;
}
}mp[];
int bsgs(int x,int v,int sgn){
int m=sqrt(P)+;mp[].clr(),mp[].clr();
for(R int i=,res=mul(v,x);i<=m;++i,res=mul(res,x))mp[i&].add(res,i);
for(R int i=,tmp=ksm(x,m),res=tmp;i<=m;++i,res=mul(res,tmp))
if(mp[(i*m)&^sgn].query(res)!=-)return i*m-mp[(i*m)&^sgn].query(res);
return inf;
}
int c,s,p,inv2,res,rt;
int main(){
srand(time(NULL));
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T){
c=read(),P=read(),s=Sqrt(),inv2=(P+)>>,p=mul(s+,inv2),c=mul(c,s);
res=inf;
rt=Sqrt((1ll*c*c+)%P);
if(rt!=-){
cmin(res,bsgs(p,mul(add(c,rt),inv2),)),
cmin(res,bsgs(p,mul(dec(c,rt),inv2),));
}
rt=Sqrt((1ll*c*c+P-)%P);
if(rt!=-){
cmin(res,bsgs(p,mul(add(c,rt),inv2),)),
cmin(res,bsgs(p,mul(dec(c,rt),inv2),));
}
printf("%d\n",res==inf?-:res);
}
return ;
}

参考链接:https://www.cnblogs.com/bztMinamoto/p/10664967.html

Codechef:Fibonacci Number/FN——求通项+二次剩余+bsgs的更多相关文章

  1. Codechef:Fibonacci Number/FN(二次剩余+bsgs)

    题面 传送门 前置芝士 \(bsgs\),\(Cipolla\) 题解 因为题目保证\(p\bmod 10\)是完全平方数,也就是说\(p\bmod 5\)等于\(1\)或\(-1\),即\(5\)是 ...

  2. 求四百万以内Fibonacci(number)数列偶数结果的总和

    又对啦...开心~~~~ 只是代码可能不符合PEP标准什么的... Each new term in the Fibonacci sequence is generated by adding the ...

  3. Fibonacci number

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  4. fibonacci number & fibonacci sequence

    fibonacci number & fibonacci sequence https://www.mathsisfun.com/numbers/fibonacci-sequence.html ...

  5. Buge's Fibonacci Number Problem

    Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...

  6. [UCSD白板题] The Last Digit of a Large Fibonacci Number

    Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ...

  7. [UCSD白板题 ]Small Fibonacci Number

    Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ...

  8. (斐波那契总结)Write a method to generate the nth Fibonacci number (CC150 8.1)

    根据CC150的解决方式和Introduction to Java programming总结: 使用了两种方式,递归和迭代 CC150提供的代码比较简洁,不过某些细节需要分析. 现在直接运行代码,输 ...

  9. Algorithms - Fibonacci Number

    斐波那契数列(Fibonacci Number)从数学的角度是以递归的方法定义的: \(F_0 = 0\) \(F_1 = 1\) \(F_n = F_{n-1} + F_{n-2}\) (\(n \ ...

随机推荐

  1. 安装cnpm出现问题

    安装cnpm: 命令行中输入   npm install -g cnpm --registry=http://registry.npm.taobao.org 报:cnpm不是内部命令 解决方法:设置环 ...

  2. JVM堆内存参数优化,让性能飞起来

    堆内存是Java进程的重要组成部分,几乎所有与应用相关的内存空间都和堆有关.现在主要介绍与堆内存相关的参数设置,这些参数对Java虚拟机中非常重要的,也是对程序性能有着重要的影响.让你彻底脱离OOM内 ...

  3. Python之路【第二十八篇】:django视图层、模块层

    1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XM ...

  4. 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记

    Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...

  5. vue-cli中轮播图vue-awesome-swiper使用方法

    1 npm 安装 npm install vue-awesome-swiper --save 2在所用的组件中引入 import 'swiper/dist/css/swiper.css' import ...

  6. python鸭子类型

    “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就能够被称为鸭子” python的鸭子类型的设计让python的诸多对象的分类和应用更加灵活,需要注意类型和对象的区别(pytho ...

  7. Unity - LayerMask简析

    本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask.LayerToName.NameToLayer 等函数的使用方法及其注意事项. 项目地址:3D坦克大战 ...

  8. docker swarm yaml

    https://www.cnblogs.com/bigberg/p/8867326.html 一.简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编 ...

  9. Java调用Http/Https接口(3)--Commons-HttpClient调用Http/Https接口

    Commons-HttpClient原来是Apache Commons项目下的一个组件,现已被HttpComponents项目下的HttpClient组件所取代:作为调用Http接口的一种选择,本文介 ...

  10. Dijkstra堆优化+邻接表

    Dijkstra算法是个不错的算法,但是在优化前时间复杂度太高了,为O(nm). 在经过堆优化后(具体实现用的c++ STL的priority_queue),时间复杂度为O((m+n) log n), ...