当前位置: 首页 > news >正文

P3543 POI 2012 WYR-Leveling Ground Sol

题目链接

问题转化

问题不妨转化为 \(a \cdot f_{n-1} + b \cdot f_n \equiv 0 \pmod m\),要求找到最小的 \(n\) 满足这个条件。

不妨令 \(b = -b\),则有 \(a \cdot f_{n-1} \equiv b \cdot f_n \pmod m\)

我们希望让 \(a,b,n\) 能够独立,也就是 \(a,b\) 在同一侧, \(f_n,f_{n-1}\) 在另一侧。

第一次变化

根据 \(a \equiv b \pmod m\) 等价于 \(a/d \equiv b/d \pmod {m/d}\),我们不妨令 \(g = gcd(a,b,m)\),则有 \(a' \cdot f_{n-1} \equiv b' \cdot f_n \pmod {m'}\)。(其中 \(a'=a/g,b'=b/g,m'=m/g\))。

第二次变化

此时 \(gcd(a',m')\)\(gcd(b',m')\) 都可能大于 1,也就还不能使用逆元。但是在此时,我们有 \(gcd(a',m) = gcd(f_n,m') = p\)\(gcd(b',m')=gcd(f_{n-1},m') = q\)

因此,式子变成了 \(\frac{a'/p}{b'/q} \equiv \frac{f_n/p}{f_{n-1}/q} \pmod{\frac{m'}{pq}}\)。我们只需要对于每一个 \(m'\),预处理出 \(p,q,\frac{f_n/p}{f_{n-1}/q}\) 对应的答案就好了。

上面的发现可能很难注意到,这里给出证明。

我们先让 \(p = gcd(a',m')\)\(g = gcd(f_n,m')\)

根据 \(a \equiv b \pmod m\)\(d \mid m\) 时有 \(a \equiv b \pmod d\) 这一式子,我们有 \(a' \cdot f_{n-1}\equiv b' \cdot 0 \equiv 0 \pmod {g}\)。又因为 \(f_n\)\(f_{n-1}\) 互质,因此只能 \(g \mid a'\)。又因为 \(g \mid m'\),因此有 \(g \mid gcd(a',m')\),即 \(g \mid p\)

同样的,我们有 \(0 \cdot f_{n-1} \equiv b' \cdot f_n \pmod {p}\),又因为 \(gcd(b,p)=0\),因此有 \(p \mid f_n\)。结合 \(p \mid m'\),有 \(p \mid gcd(f_n,m')\)。也就有了 \(p \mid g\)

因为 \(p \mid g\)\(g \mid p\),有 \(p = g\),证毕。

时间复杂度证明

根据结论,有斐波那契数列的循环节是 \(O(m)\) 级别的,因此预处理时间复杂度是 \(O(\sum\limits_{x \mid m} x \log m)\)。单次查询是 \(\log m\) 的。

Code

这里需要注意特判 \(a = 0\)\(b=0\) 的情况。并且求逆元不要用费马小定理,要用扩展欧几里得。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
const int N = 1e5 + 10;
int n,m;
map< pair<int, pair<int,int> > , int>  mp[N];
void exgcd(LL a,LL b,LL &x,LL &y){if(b == 0){x = 1,y = 0;return ;}exgcd(b,a%b,y,x);y = y - a / b * x;
}
LL inv(LL a,LL b){LL x,y;exgcd(a,b,x,y);return (x + b) % b;
}
int gcd(int a,int b){if(b == 0)return a;return gcd(b,a%b);
}
void init(){for(int i=2;i<=m;i++){if(m % i == 0){int x = 0,y = 1;for(int j=1;;j++){if(x && y){int p = gcd(y,i),q = gcd(x,i);int m$ = i / p / q;int k = (y / p) * inv(x / q,m$) % m$;if(!mp[i].count({k,{q,p}})) mp[i][{k,{q,p}}] = j; }int tmpx = x,tmpy = y;x = tmpy;y = (tmpx + tmpy) % i;if(x == 0 && y == 1) break;}}}return ;
}
int main(){IOS;cin >> n >> m;init();for(int i=1;i<=n;i++){int a,b;cin >> a >> b;b = (m - b) % m;if(a == 0){cout << 0 << "\n";continue;}if(b == 0){cout << 1 << '\n';continue;}int g = gcd(gcd(a,b),m);int m$ = m / g;a /= g;b /= g;int p = gcd(a,m$),q = gcd(b,m$);int m$$ = m$ / p / q;int k = (a / p) * inv(b / q,m$$) % m$$;if(mp[m$].count({k,{q,p}}))cout << mp[m$][{k,{q,p}}] << "\n";elsecout << -1 << "\n";}return 0;
}
http://www.zskr.cn/news/1327905.html

相关文章:

  • 2026白山市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一修哥修缮
  • 2026 郑州装修公司口碑 TOP5 权威榜单(附核心优势与避坑指南) - 速递信息
  • 采购高低温交变试验箱前必看:如何判断厂家的综合实力? - 品牌推荐大师1
  • 保姆级教程:用国内镜像源5分钟搞定Spacy和en_core_web_lg模型下载安装
  • TrollInstallerX:iOS 14-16.6.1设备一键安装TrollStore的终极解决方案
  • 2026毕节市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一修哥修缮
  • Xcode 14 Archives打包上传TestFlight保姆级避坑指南(含ipa导出)
  • 从零到一:手把手教你用MetaMask创建钱包并完成第一笔Sepolia测试网转账(保姆级避坑指南)
  • 从磁铁到代码:用ST电机库5.4.4手把手实现你的第一个FOC电机驱动
  • 广东自建房封窗品牌排行 实测性能与场景适配对比 - 奔跑123
  • 从CPU视角看Cache:深入理解Offset、Index、Tag如何协同工作提升程序性能
  • 别再手动填密钥了!STM32G0 RSA签名验签的自动化脚本与避坑指南
  • Sunshine游戏串流:打造你的专属云端游戏服务器
  • 【今日复盘】2026年5月19日
  • 深入OPTEE密钥链:从HUK到FEK,一次搞懂安全存储的加密层级与密钥派生
  • 终于把workbuddy培养出DeepSeek V4Pro了
  • 8大网盘直链下载终极指南:一键获取真实下载地址,告别限速烦恼
  • 2026年武汉阳台改造评测:8大品质品牌实力对比 - 优家闲谈
  • 28亿美元!被字节逼到无路可走的喜马拉雅终于卖给了腾讯
  • Beyond Compare 5密钥生成全指南:轻松解决激活失败问题
  • 怎么评价项目经理是一个合格的项目经理?
  • Diablo Edit2完全攻略:暗黑破坏神2角色编辑器的终极使用方案
  • 别再只调API了!用LangChain+Neo4j+ChatGLM-6B,手把手教你搭建一个能“思考”的本地知识问答系统
  • 精准识别胡椒成熟度!YOLO-AVCA-CBAMNet 让智慧农业更高效
  • JDK11在Win11上安装后,为什么不用配环境变量也能用?聊聊背后的自动配置机制
  • 天下工厂的 5 维度筛选公式为什么能 2 小时出名单
  • 【游戏架构实战指南】MVC、ECS、MVVM模式深度解析与选型策略
  • 前端加密数据传后端,URL里的加号‘+’变空格?两种方案彻底解决(附代码)
  • 涉密场景刚性适配,无感定位成为UWB合规替代方案
  • 实时调试不翻文档,Perplexity代码查询效率提升300%,这7个隐藏参数你必须掌握