HDU——1788 Chinese remainder theorem again

时间:2023-03-10 06:42:24
HDU——1788 Chinese remainder theorem again

再来一发水体,是为了照应上一发水题。

再次也特别说明一下,白书上的中国剩余定理的模板不靠谱。

老子刚刚用柏树上的模板交上去,简直wa出翔啊。

下面隆重推荐安叔版同余方程组的求解方法。

反正这个版本十分强大,适用于各种情况。

题目的意思是告诉你I和a,接下来有I个mi,它所对应的余数ai=mi-a;

这里我用白书上的模板交上去就wa了哦,用这个版本吧。

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std; ll c[11],m[11],n,t; void exgcd(ll A,ll B,ll& d,ll& x,ll& y)
{
if (B==0) { x=1,y=0,d=A; }
else { exgcd(B,A%B,d,y,x); y-=A/B*x; }
} ll china()
{
bool ans=true;
ll am=m[1],d,y0,z0;
ll ac=c[1];
for (ll i=2; i<=n; i++)
{
exgcd(am,m[i],d,y0,z0);
if ((ac-c[i])%d!=0)
{
ans=false;
break;
}
y0=(c[i]-ac)/d*y0;
y0=((y0%(m[i]/d))+(m[i]/d))%(m[i]/d);
ac=am*y0+ac,am=am/d*m[i],ac=(ac%am+am)%am;
}
if (ac==0) ac=am;//这里是题目说明了整数,不能为0哦。
return ac;
} int main()
{
while (cin>>n>>t && (n|t))
{
for (ll i=1; i<=n; i++) scanf("%I64d",&m[i]),c[i]=m[i]-t;
cout<<china()<<endl;
}
return 0;
}