# POJ2891_Strange Way to Express Integers

题意:


给定2n个正整数 a1, a2, ... , anm1, m2, ..., mn ,求最小的正整数解满足方程组

i[1, n],xmi (mod ai)

解:


因为不保证所有 a 两两互质,所以中国剩余定理不适用

考虑已经求解出一个能使前 k1 个方程成立的特解 x

并且设 A=lcm(a1,a2,...ak1)

因为 A  0 (mod ai) | i[1, k1]

显然,前 k1 个方程有通解 x+iA(iZ)

那么考虑从前 k1 个方程的解集 {x+tA} 中找到一个 t 使得解 x+tA 同时使第 k 个方程成立

即使得 x+tAmk (mod ak)

移项得 Atmkx (mod ak)

化为 axb (mod m) 的形式,其中 a=A, x=t, b=(mkx)

由此可解关于 t 的线性同余方程并顺便判断是否有解

解得一个特解 t 使得 x+tAmk (mod ak) 之后

就得到了一个特解 x=x+tA 满足前 k 个方程成立

由此,完成一次递推

综上,先求出第1个方程,然后顺次递推求解 k1 个方程即可得到一个满足所有方程成立的特解


代码:

#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n, t; ll a[50], m[50]; ll xs[50]; ll lcmm[50]; bool flag; ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; } void exgcd(ll a, ll b, ll &x, ll &y) { // cout << "### work" << endl; if (b == 0) { x = 1; y = 0; return; } exgcd(b, a % b, x, y); ll z = x; x = y; y = z - y * (a / b); } bool solve(ll a, ll &x, ll b, ll m) { ll d = gcd(a, m); ll y; if (b % d != 0) return false; // cout << "### work" << endl; exgcd(a, m, x, y); x = x * (b / d) % m; return true; } void ini() { lcmm[1] = m[1]; for (ll i = 2; i <= n; i++) { lcmm[i] = abs(lcmm[i - 1] / gcd(lcmm[i - 1], -m[i])) * m[i]; } } int main() { scanf("%lld", &n); flag = true; for (ll i = 1; i <= n; i++) scanf("%lld%lld", &m[i], &a[i]); flag = solve(1ll, xs[1], a[1], m[1]); if (flag == false) { cout << -1 << endl; return 0; } ini(); for (ll k = 2; k <= n; k++) { flag = solve(lcmm[k - 1], t, a[k] - xs[k - 1], m[k]); if (flag == false) { cout << -1 << endl; return 0; } xs[k] = xs[k - 1] + t * lcmm[k - 1]; } while (xs[n] < 0) xs[n] += lcmm[n]; xs[n] = xs[n] % lcmm[n]; cout << xs[n] << endl; // cout << xs[1] << endl; }

__EOF__

本文作者熹圜
本文链接https://www.cnblogs.com/Xiwon/p/13377040.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   熹圜  阅读(74)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示