传送门


problem

设 FiF_iFi​ 表示斐波那契数列:

{Fn=n,n≤1Fn=Fn−1+Fn−2,otherwise\begin{cases} F_n=n ,&n ≤ 1\\ F_n=F_{n-1}+F_{n-2}, &\mathrm{otherwise} \end{cases}{Fn​=n,Fn​=Fn−1​+Fn−2​,​n≤1otherwise​

给定 ccc 和 ppp,求满足 Fn≡c(modp)F_n\equiv c\pmod pFn​≡c(modp) 的最小的 nnn。

保证 11≤p≤2×10911\le p\le2\times10^911≤p≤2×109,ppp 是素数,且 pmod10p\bmod 10pmod10 是一个完全平方数。


solution

首先,斐波那契数列是有通项公式的:

Fn=15((1+52)n−(1−52)n)F_n=\frac1{\sqrt 5}\left((\frac{1+\sqrt 5}{2})^n-(\frac{1-\sqrt 5}{2})^n\right)Fn​=5​1​((21+5​​)n−(21−5​​)n)

那么设 φ=1+52\varphi=\frac{1+\sqrt 5}2φ=21+5​​,那么 −1φ=1−52-\frac 1\varphi=\frac{1-\sqrt5}{2}−φ1​=21−5​​,那么相当于是解:

15(φn−(−1φ)n)≡c(modp)φn−(−1)nφn≡5c(modp)\begin{aligned} \frac{1}{\sqrt 5}(\varphi^n-(-\frac 1 \varphi)^n)&\equiv c\pmod p \\\varphi^n-\frac{(-1)^n}{\varphi^n}&\equiv \sqrt5c\pmod p \end{aligned}5​1​(φn−(−φ1​)n)φn−φn(−1)n​​≡c(modp)≡5​c(modp)​

又令 ϕ=φn\phi=\varphi^nϕ=φn,继续化简,有:

ϕ−(−1)nϕ≡5c(modp)\phi-\frac{(-1)^n}{\phi}\equiv \sqrt5c\pmod pϕ−ϕ(−1)n​≡5​c(modp)

然后用个求根公式就可以解出 ϕ\phiϕ:

ϕ≡5c±5c2+4(−1)n2(modp)\phi\equiv\frac{\sqrt 5c\pm\sqrt{5c^2+4(-1)^n}}{2} \pmod pϕ≡25​c±5c2+4(−1)n​​(modp)

那么用二次剩余就可以解 ϕ\phiϕ 了,又由于 ϕ=φn\phi=\varphi^nϕ=φn,再套个 BSGS 解 nnn 即可。注意解得时候要特判 nnn 的奇偶性来解。

然后 555 是模 ppp 意义下的二次剩余,直接解就可以了。

由于 ppp 是素数,且 pmod10p \bmod 10pmod10 是完全平方数,所以 p=±1(mod5)p=\pm1\pmod 5p=±1(mod5),那么 p5−12=1p^{\frac{5-1}2}=1p25−1​=1,即 ppp 是模 555 意义下的二次剩余。
根据二次互反律,设 p,qp,qp,q 是不同的奇素数,有:

(pq)(qp)=(−1)p−12q−12\left(\frac pq\right)\left(\frac qp\right)=(-1)^{\frac{p-1}2\frac{q-1}2}(qp​)(pq​)=(−1)2p−1​2q−1​

其中 (pq)\left(\frac pq\right)(qp​) 是勒让德符号
那么把 555 和 ppp 代进上式,就不难发现 555 是模 ppp 意义下的二次剩余。


code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T,C,P,s5,U,V;
int add(int x,int y)  {return (ll)x+y>=P?(ll)x+y-P:x+y;}
int dec(int x,int y)  {return (ll)x-y< 0?(ll)x-y+P:x-y;}
int mul(int x,int y)  {return (ll)x*y>=P?(ll)x*y%P:x*y;}
int power(int a,int b){int ans=1;for(;b;b>>=1,a=mul(a,a))  if(b&1)  ans=mul(ans,a);return ans;
}
int Inv(int x)  {return power(x,P-2);}
void Max(int &x,int y)  {if(x<y)x=y;}
void Min(int &x,int y)  {if(x>y)x=y;}
namespace Cipolla{int I,val;struct num{int x,y;num(int x=0,int y=0):x(x),y(y){}friend num operator*(const num &a,const num &b){return num(add(mul(a.x,b.x),mul(val,mul(a.y,b.y))),add(mul(a.y,b.x),mul(a.x,b.y)));}friend num operator^(num a,int b){num ans(1,0);for(;b;b>>=1,a=a*a)  if(b&1)  ans=ans*a;return ans;}};int Sqrt(int n){if(!n)  return 0;if(power(n,(P-1)>>1)==P-1)  return -1;while(1){I=rand(),val=dec(mul(I,I),n);if(power(val,(P-1)>>1)==P-1)  break;}return (num(I,1)^((P+1)>>1)).x;}
}
using Cipolla::Sqrt;
unordered_map<int,int>Hash;
int BSGS(int a,int b,int type){Hash.clear();int now=b,t=ceil(sqrt(P));for(int i=0;i<t;++i)  Hash[now]=i,now=mul(now,a);now=1,a=power(a,t);if(!a)  return b?P+1:1;for(int i=0,pos;i<=t;++i){pos=(Hash.find(now)==Hash.end())?-1:Hash[now],now=mul(now,a);if(pos>=0&&i*t-pos>=0&&((i*t-pos)&1)==type)  return i*t-pos;}return P+1;
}
int main(){scanf("%d",&T);while(T--){scanf("%d%d",&C,&P);s5=Sqrt(5),U=mul(add(1,s5),Inv(2)),V=mul(C,s5);int d1=add(mul(V,V),4),d2=dec(mul(V,V),4),ans=P+1;if(!d1||power(d1,(P-1)>>1)==1){int tmp=Sqrt(d1),val;val=mul(add(V,tmp),Inv(2)),Min(ans,BSGS(U,val,0));val=mul(dec(V,tmp),Inv(2)),Min(ans,BSGS(U,val,0));}if(!d2||power(d2,(P-1)>>1)==1){int tmp=Sqrt(d2),val;val=mul(add(V,tmp),Inv(2)),Min(ans,BSGS(U,val,1));val=mul(dec(V,tmp),Inv(2)),Min(ans,BSGS(U,val,1));}printf("%d\n",ans==P+1?-1:ans);}return 0;
}

「Codechef FN」Fibonacci Number相关推荐

  1. macbook快捷键_MacBook 键盘的「fn」键有什么用

    大家都知道,MacBook 和其他 Windows 系统的电脑键盘还是有很大区别的. 在 Windows 中 108 键的键盘是使用范围广,各种快捷键更是不少. 而 MacBook 的键盘则不同,在 ...

  2. extjs中滚动条属性_36个工作中常用的JavaScript函数片段「值得收藏」

    作者:Eno_Yao 转发链接:https://segmentfault.com/a/1190000022623676 前言 如果文章和笔记能带您一丝帮助或者启发,请不要吝啬你的赞和收藏,你的肯定是我 ...

  3. 「Vue实战」武装你的前端项目

    1. 接口模块处理 1.1 axios二次封装 很基础的部分,已封装好的请跳过.这里的封装是依据 JWT import axios from 'axios'import router from '.. ...

  4. 史上最全!56个JavaScript的「手写」知识点,扫盲啦!

    关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 今天就带着大家来复习一下JavaScript的56个「手写」知识点哦~~~ 大厂手写题 1.实现原生 AJAX 封装 const a ...

  5. 编程语言发展70年,用50种不同语言输出「Hello World」

    「免费学习 60+ 节公开课,投票页面,点击讲师头像」 作者 | Sylvain Saurel 译者 | 风车云马 责编 | 屠敏 [导读]历经 70 年,不断出现的编程语言为开发者解决了哪些难题?其 ...

  6. php rfc3986规范,「PSR 规范」PSR-7 HTTP 消息接口规范

    「PSR 规范」PSR-7 HTTP 消息接口规范 HTTP消息接口 此文档描述了 RFC 7230 和 RFC 7231 HTTP 消息传递的接口,还有 RFC 3986 里对 HTTP 消息的 U ...

  7. 「SAP技术」SAP WM 如何根据TR号码查询TO号码?

    「SAP技术」SAP WM 如何根据TR号码查询TO号码? 今日下午,收到K项目的仓库部门用户的提问,如何通过TR号码查找TO单号码.笔者想到了LT22 & LT23等TO查询的报表里,是可以 ...

  8. OpenAI解析「AI算力」:3个半月翻一倍,6年超过30万倍

    来源:OpenAI 「雷克世界」编译:嗯~是阿童木呀.KABUDA.EVA 摘要:近日,OpenAI发布了一份分析报告显示,自2012年以来,在最大规模的人工智能训练中所使用的计算量呈指数级增长,3. ...

  9. vue源码-对于「计算属性」的理解

    vue源码-对于「计算属性」的理解 这是我最近学习vue源码的一个个人总结和理解,所以可能并不适合每一位读者 本文的整体脉络如下,首先尽可能去掉细节,对计算属性源码的大致实现有一个了解,然后举一例子, ...

最新文章

  1. 分享3个好用到爆的 Python 模块,点赞收藏
  2. 你的眼睛一天内经历几万次“失明”,只是为了让你看清世界
  3. vue2.0无限滚动加载数据插件
  4. mockjs针对value生成随机数值(随机字符串,数值,日期,url,图片地址,email,ip等)
  5. 轻量级锁的加锁和解锁逻辑-自旋锁
  6. mysql -- MAC下安装配置mysql
  7. html的table弹窗_Js弹出基于Table的可关闭浮动层
  8. 年薪40W+还招不到人!人工智能到底有多火?(附人工智能+Python 自学视频资料)...
  9. DUMP文件分析6:简单的堆破坏示例
  10. android百度地图根据点路线规划,Android 百度地图路径规划一直都是搜索不到结果...
  11. XOOPS模块开发快速入门中文翻译(二)
  12. 压箱底的Android UI开源库(一)
  13. 海底捞张勇:谈钱,才是对员工最好的尊重
  14. 第三节 UNIX文件系统结构
  15. Web前端计算FPS:使用原生requestAnimationFrame API
  16. ubuntu 18.04 + SVO2.0
  17. 软件需求分析——非功能性需求
  18. 0基础怎么画出好看的水彩画美术集水彩教程入门级教程
  19. AppleTalk:Apple 公司协议组--网络大典
  20. 用python写一元二次方程_使用Python解一元二次方程!

热门文章

  1. 回顾Mysql中聚合函数之concat和GROUP_CONCAT
  2. Fish Li的一些可供下载的资源列表
  3. 【前端技术】前端开发效率管理
  4. CF-Edu101-D-Ceil Divisions(构造)
  5. 前端必备技术之——AJAX
  6. vue打包时semver.js版本报错
  7. VC++2005相关问题解决方案
  8. UIDesigner 2.5
  9. pyqt5 python版本_PyQt5下载-Qt库的Python版本 v5.8.2免费版 - 安下载
  10. Android播放网络视频截图