当前位置:网站首页>[WC2021] 斐波那契——数论、斐波那契数列
[WC2021] 斐波那契——数论、斐波那契数列
2022-06-29 04:07:00 【偶耶XJX】
[WC2021] 斐波那契
题解
这里不得不向 Tiw 神下跪~
一道黑题被他讲成一道蓝题难度
根本不会做的我瞬间感觉自己降智了好多
首先发现我们要解决的是满足这个式子:
a f n − 1 + b f n = 0 ( m o d m ) af_{n-1}+bf_n=0\,\,(\bmod\, m) afn−1+bfn=0(modm)的最小的 n n n。
我们可以先处理一下,令 c = gcd ( a , b , m ) , a ′ = a c , b ′ = b c , m ′ = m c c=\gcd(a,b,m),a'=\frac{a}{c},b'=\frac{b}{c},m'=\frac{m}{c} c=gcd(a,b,m),a′=ca,b′=cb,m′=cm,然后有如下性质:
gcd ( gcd ( a ′ , m ′ ) , gcd ( b ′ , m ′ ) ) = 1 gcd ( f n , f n − 1 ) = 1 \gcd(\gcd(a',m'),\gcd(b',m'))=1\\ \gcd(f_n,f_{n-1})=1 gcd(gcd(a′,m′),gcd(b′,m′))=1gcd(fn,fn−1)=1因为取模 m ′ m' m′ 不影响与 m ′ m' m′ 的 gcd \gcd gcd,由 gcd ( a ′ f n − 1 , m ′ ) = gcd ( b ′ f n , m ′ ) \gcd(a'f_{n-1},m')=\gcd(b'f_n,m') gcd(a′fn−1,m′)=gcd(b′fn,m′) 可得:
gcd ( a ′ , m ′ gcd ( f n − 1 , m ′ ) ) gcd ( f n − 1 , m ′ ) = gcd ( b ′ , m ′ ) gcd ( f n , m ′ gcd ( b ′ , m ′ ) ) ⇒ gcd ( f n − 1 , m ′ ) gcd ( f n , m ′ gcd ( b ′ , m ′ ) ) = gcd ( b ′ , m ′ ) gcd ( a ′ , m ′ gcd ( f n − 1 , m ′ ) ) \gcd(a',\frac{m'}{\gcd(f_{n-1},m')})\gcd(f_{n-1},m')=\gcd(b',m')\gcd(f_n,\frac{m'}{\gcd(b',m')})\\ \Rightarrow \frac{\gcd(f_{n-1},m')}{\gcd(f_n,\frac{m'}{\gcd(b',m')})}=\frac{\gcd(b',m')}{\gcd(a',\frac{m'}{\gcd(f_{n-1},m')})}\\ gcd(a′,gcd(fn−1,m′)m′)gcd(fn−1,m′)=gcd(b′,m′)gcd(fn,gcd(b′,m′)m′)⇒gcd(fn,gcd(b′,m′)m′)gcd(fn−1,m′)=gcd(a′,gcd(fn−1,m′)m′)gcd(b′,m′)因为两边的分式的分子分母都互质,所以两边都是最简分式,有 gcd ( f n , m ′ gcd ( b ′ , m ′ ) ) = gcd ( a ′ , m ′ gcd ( f n − 1 , m ′ ) ) gcd ( f n − 1 , m ′ ) = gcd ( b ′ , m ′ ) \gcd(f_n,\frac{m'}{\gcd(b',m')})=\gcd(a',\frac{m'}{\gcd(f_{n-1},m')})\\ \gcd(f_{n-1},m')=\gcd(b',m') gcd(fn,gcd(b′,m′)m′)=gcd(a′,gcd(fn−1,m′)m′)gcd(fn−1,m′)=gcd(b′,m′)而我们需要的只有第二条。
令 g = gcd ( b ′ , m ′ ) g=\gcd(b',m') g=gcd(b′,m′),那么有 − a ′ b ′ g = f n f n − 1 g ( m o d m ′ g ) \frac{-a'}{\frac{b'}{g}}=\frac{f_n}{\frac{f_{n-1}}{g}}\,\,(\bmod\, \frac{m'}{g}) gb′−a′=gfn−1fn(modgm′),此时分母与模数互质,可以求逆元。
于是就得到一种做法:先预处理,枚举所有可能的 m ′ m' m′( m m m 的因子),然后枚举斐波那契数列,把相邻两项按 g = gcd ( f n − 1 , m ′ ) g=\gcd(f_{n-1},m') g=gcd(fn−1,m′) 分类,每一类用 map 记录到达一种 f n f n − 1 g \frac{f_n}{\frac{f_{n-1}}{g}} gfn−1fn 值的最小的 n n n。由于斐波那契在模意义下循环节长度是 O ( 模 数 ) O(模数) O(模数) 的,所以预处理复杂度大概是 m m m 的因子的和带个 log \log log,不超过 O ( m log 2 m ) O(m\log^2m) O(mlog2m)。
询问直接找到对应的 m ′ m' m′ 对应的类再在 map 里查询即可。
代码
#include<bits/stdc++.h>//JZM yyds!!
#define ll long long
#define lll __int128
#define uns unsigned
#define fi first
#define se second
#define IF (it->fi)
#define IS (it->se)
#define END putchar('\n')
#define lowbit(x) ((x)&-(x))
#define inline jzmyyds
using namespace std;
const int MAXN=114514;
const ll INF=1e18;
ll read(){
ll x=0;bool f=1;char s=getchar();
while((s<'0'||s>'9')&&s>0){
if(s=='-')f^=1;s=getchar();}
while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),s=getchar();
return f?x:-x;
}
int ptf[50],lpt;
void print(ll x,char c='\n'){
if(x<0)putchar('-'),x=-x;
ptf[lpt=1]=x%10;
while(x>9)x/=10,ptf[++lpt]=x%10;
while(lpt>0)putchar(ptf[lpt--]^48);
if(c>0)putchar(c);
}
int Q,m;
unordered_map<int,unordered_map<int,int> >mp[MAXN];
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);}
ll exgcd(ll a,ll b,ll&x,ll&y){
if(!b)return x=1,y=0,a;
ll d=exgcd(b,a%b,y,x);
return y-=a/b*x,d;
}
ll inv(ll a,ll p){
ll x,y,d=exgcd(a,p,x,y);
if(d!=1)return 1145141919810;
return (x%p+p)%p;
}
int main()
{
Q=read(),m=read(),mp[1][1][0]=2;
for(int x=2;x<=m;x++)if(m%x==0){
ll a=1,b=1;
for(int i=2;;i++,swap(a,b),(b+=a)%=x){
ll d=gcd(a,x),c=b*inv(a/d,x/d)%(x/d);
if(mp[x][d].count(c))break;
mp[x][d][c]=i;
}
}
while(Q--){
ll a=read(),b=read();
if(!a){
print(0);continue;}
if(!b){
print(1);continue;}
ll d=gcd(gcd(a,b),m),k=m/d;
a/=d,b/=d,d=gcd(b,k);
ll c=(m-a)*inv(b/d,k/d)%(k/d);
auto it=mp[k][d].find(c);
if(it!=mp[k][d].end())print(IS);
else print(-1);
}
return 0;
}
边栏推荐
- 【C语言】详解线程回收函数 pthread_join
- HCIE-Security Day41:理论学习:信息收集与网络探测
- [MCU framework][dfu] DFU upgrade example with CRC verification + timeout mechanism +led indicator + chip locking + chip self erasure
- 人大金仓(KingBase)导出表结构
- Devops note-05: what are the roles of Ba, SM, Po, PM, PD, dev, OPS and QA in the IT industry
- Four distributed session solutions
- Data statistical analysis (SPSS) [7]
- Anaconda's own Spyder editor starts with an error
- Data collection and management [6]
- Data collection and management [12]
猜你喜欢

High performance current limiter guava ratelimiter

Ask the handler about the memory leak scenario in the interview. Don't just know static internal classes & weak references!

Distributed ID solution

微秒级 TCP 时间戳

欧拉开源社区第二届理事会第二次会议召开,新华三、超聚变和龙芯中科成为理事会成员单位

【布里渊现象】光纤布里渊温度和应变分布同时测量系统研究

自己动手搭建一个简单的网站

Libuv库概述及libevent、libev、libuv对比(转载)

MySQL复习资料(附加)case when

leetcode - 295. Median data flow
随机推荐
【C语言】解决 “address of stack memory associated with local variable ‘num‘ returned”
Data collection and management [10]
Influence of air resistance on the trajectory of table tennis
NotImplementedError: Could not run torchvision::nms
Data statistical analysis (SPSS) [7]
Black screen and error reporting when loading custom models for gazebo with roslaunch
iNFTnews | 元宇宙技术将带来全新的购物体验
Data collection and management [8]
干货丨微服务架构是什么?有哪些优点和不足?
Analysis on the types of source code anti leakage technology
How to keep database and cache consistent
sql两列变为多行过滤显示
欧拉开源社区第二届理事会第二次会议召开,新华三、超聚变和龙芯中科成为理事会成员单位
Devops note-05: what are the roles of Ba, SM, Po, PM, PD, dev, OPS and QA in the IT industry
科技雲報道:混合辦公的B面:安全與效率如何兼得?
My creation anniversary
数据库和缓存如何保持一致性
Data collection and management [6]
If you choose the right school, you can enter Huawei as a junior college. I wish I had known
泠静的想一想自己的路