同余方程
题意:求满足a*x≡1(mod b)的最小整数x。
思路:由线性同余方程的基本性质,ax≡1(modb)ax≡1(modb)当且仅当gcd(a, b) = 1时才有解。由Bézout定理,有ax+by=1ax+by=1,可以先利用扩展欧几里得算法求出一组特解x0,y0x0,y0,然后通过取模把范围降到1~b之间即可。x有可能为负数,但负数模b还是负数,因此(x%b+b)%b处理。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cmath> #define ll long long using namespace std; ll a,b,x,y; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(!b) { x=1; y=0; return a; } ll d=ex_gcd(b,a%b,x,y); ll z=x; x=y; y=z-y*(a/b); return d; } int main() { x=0; y=0; scanf("%lld%lld",&a,&b); ex_gcd(a,b,x,y); printf("%lld\n",(x%b+b)%b); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步