题意

定义 $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. [转帖]Java中重写和重载与多态的关系

    Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67  收藏 更多 分类专栏: java进阶之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  2. Android调试桥 adb安装详解

    Android调试桥(adb) 一.简介 Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Uni ...

  3. Spring 学习指南 第三章 bean的配置 (未完结)

    第三章 bean 的配置 ​ 在本章中,我们将介绍以下内容: bean 定义的继承: 如何解决 bean 类的构造函数的参数: 如何配置原始类型 (如 int .float 等) .集合类型(如 ja ...

  4. 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序

    第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...

  5. ubuntu 安装和配置 GitLab

    一.概述 GitLab 是一个基于 Web 的开源 Git 软件仓库管理器,用 Ruby 编写,包括 wiki,问题管理,代码审查,监控以及持续集成和部署.它使开发人员能够创建,审查和部署他们的项目. ...

  6. hystrix中request cache请求缓存

    有一个概念,叫做reqeust context,请求上下文,一般来说,在一个web应用中, 我们会在一个filter里面,对每一个请求都施加一个请求上下文,就是说,tomcat容器内,每一次请求,就是 ...

  7. mongoDB对没有字段的记录新增字段

    db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...

  8. 以yarn-client方式提交spark任务,任务一直卡在ACCEPTED状态

    问题背景 spark是以客户端的方式安装的,并没有启动spark的mesos集群,这时候的spark就相当与hive客户端. 以local模型和yarn-cluster方式提交任务,都能正确额执行,但 ...

  9. EF CodeFirst Dome学习

    创建ConsoleDome控制台应用程序 从NuGet包管理器安装EntityFramework 创建DbContextDome类并继承DbContext public class DbContext ...

  10. Mycat使用--分库分表和读写分离

    Mycat分库分表读写分离 1. 模拟多数据库节点 2. 配置文件 具体操作参看: https://blog.csdn.net/vbirdbest/article/details/83448757 写 ...