T186362 一元一次同余方程组 题解

注意到这个题不是中国剩余定理。

首先考虑化为中国剩余定理的形式,那么如何才可以消去左边的a呢?

考虑后,我们可以发现如下结论:如果b不能被gcd(a,c)整除,那么原方程就没有解。因为此时左边一定有一个质因子但右边没有

而如果可以整除,就可以令原式全部除以gcd(a,c),因为atx+bty=tcax+by=c的解集是完全相同的

于是a和c就互质了。

这个时候就可以在等式两边同时乘a的逆元。

于是原式的形式就变为了中国剩余定理的标准形式。

但是还不够,因为我们依然无法保证所以的c两两互质

经过思考,继续使用中国剩余定理已经不可能了,因为原来的互质的性质被破坏后,大多数结论都会发生改变。

这个时候我们考虑通过数学归纳法求解。


假设我们已经得到了前k-1个柿子的通解为t+xlcm(xZ),其中t为一个特解
然后,第k个柿子提供的限制条件为
t+xlcmbi(mod ci)
这是一个线性同余方程,转化为不定方程后移项,得
xlcm+yci=bit
利用exgcd求出新的通解即可。
这个题也是模板EXCRT的强化版。
注意一个问题,求逆元时要使用EXGCD,因为模数不是质数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
inline int r()
{
int s=0,k=1;char c=getchar();
while(!isdigit(c))
{
if(c=='-')k=-1;
c=getchar();
}
while(isdigit(c))
{
s=s*10+c-'0';
c=getchar();
}
return s*k;
}
int n,a[1000001],b[1000001],c[1000001],x,y;
int exgcd(int a,int b)
{
if(!b)
{
x=1;y=0;
return a;
}
int g=exgcd(b,a%b),tmp=x;
x=y;
y=tmp-y*(a/b);
return g;
}
int pw(int t,int p,int mod)//t^p % mod
{
int base=t,ans=1;
while(p)
{
if(p&1)
{
ans*=base;
ans%=mod;
}
base*=base;
base%=mod;
p>>=1;
}
return ans;
}
int mul(int a,int b,int mod)
{
int ans=0;
while(b>0)
{
if(b&1)ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
int ny(int xx,int mod)
{
int g=exgcd(xx,mod);
return (x%mod+mod)%mod;
}
signed main()
{
n=r();
for(int i=1;i<=n;i++)
{
a[i]=r();b[i]=r();c[i]=r();
int g=exgcd(a[i],c[i]);
if(b[i]%g)
{
cout<<"nO sOLuTiOn"<<endl;
return 0;
}
a[i]/=g;b[i]/=g;c[i]/=g;
b[i]*=ny(a[i],c[i]);
// cout<<"逆元是"<<ny(a[i],c[i]);
b[i]%=c[i];
// cout<<b[i]<<" "<<c[i]<<endl;
}
exgcd(1,c[1]);
x*=b[1];x=(x%c[1]+c[1])%c[1];
int now=x,lcm=c[1];
for(int i=2;i<=n;i++)
{
int aa=lcm,bb=c[i],cc=b[i]-now;
int g=exgcd(aa,bb);
// cout<<"aa/lcm:"<<aa<<" bb:"<<bb<<" cc:"<<cc<<" g:"<<g<<" now:"<<now<<endl;
if(cc%g)
{
cout<<"nO sOLuTiOn"<<endl;
return 0;
}
bb/=g;
cc/=g;
x=(x%bb+bb)%bb;cc=(cc%bb+bb)%bb;
x=mul(x,cc,bb);
x=(x%bb+bb)%bb;
now=now+x*lcm;
lcm=c[i]/exgcd(c[i],lcm)*lcm;//
now=(now%lcm+lcm)%lcm;
}
cout<<now<<endl;
}
posted @   lei_yu  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示