「裴蜀定理」学习笔记
定义
设
1.对任意整数
2.存在整数
证明
第一条
理解一下即可,比较好理解
第二条
-
若任何一个等于
,则 ,这时定理显然成立 -
若
均不等于由于
,不妨设 均 ,对于
,两边同时 ,可得 ,由于除以了 的最大公约数,所以此时 互质,转证回顾
中辗转相除的思想: ,将模出来的数称作 ,则:将上述式子转换为带余数的除法
当辗转相除法除到互质时,
,以 替换 ,则有:将倒数第三个式子转化为
,代入上式然后通过同样方法消去
可证得
是一般式中 的情况同时乘以
,得
推广
逆定理
若
特殊的,当上述的
多个整数
其逆定理也成立:设
例题:
简化题意:
给定序列
解法
根据上述证明的裴蜀定理,得到序列
设
建立一个不定方程
根据裴蜀定理,方程有解当且仅当
于是得出
故此,在满足
所以共有
代码如下
#include<bits/stdc++.h> #define int long long #define endl '\n' using namespace std; template<typename Tp> inline void read(Tp&x) { x=0;register bool z=1; register char c=getchar(); for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0; for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); x=(z?x:~x+1); } int a,n,k,ans; int gcd(int a,int b){return b?gcd(b,a%b):a;} signed main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif read(n),read(k); ans=k;//此处注意! for(int i=1;i<=n;i++) read(a), ans=gcd(ans,a); cout<<k/ans<<endl; for(int i=0;i<k/ans;i++) cout<<i*ans<<' '; }
注意事项
可见代码中的一行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效