关于 EXCRT
  • 板块学术版
  • 楼主xiaoshumiao
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/17 16:14
  • 上次更新2023/12/17 16:15:03
查看原帖
关于 EXCRT
1008513
xiaoshumiao楼主2023/12/17 16:14

教练给我们布置了一道题目。我觉得和 P4777 几乎是一样的,除了多测和判无解。可是在洛谷能 AC 的代码。那儿只有 3030 分。难道是我无解判错了吗?求帮助。

#include<cstdio>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int n;
ll a[MAXN],r[MAXN];
ll exgcd(ll a,ll b,ll &x,ll &y) {
  if(b==0) {
 	x=1;
 	y=0;
 	return a;
  }
  ll ans=exgcd(b,a%b,y,x);
  y-=a/b*x;
  return ans;
}
ll guisucheng(ll a,ll b,ll mod) {
  ll ans=0;
  while(b>0) {
  	if(b%2==1)
  	  ans=(ans+a)%mod;
  	b/=2;
  	a=(a+a)%mod;
  }
  return ans;
}
ll EXCRT() {
  ll ans,m,x,y;
  ans=r[1];
  m=a[1];
  for(int i=2;i<=n;i++){
    ll b=((r[i]-ans)%a[i]+a[i])%a[i];
    ll gcd=exgcd(m,a[i],x,y);
    if(b%gcd!=0)
      return -1;
    x=guisucheng(x,b/gcd,a[i]);
    ans+=m*x;
    m*=a[i]/gcd;
    ans=(ans+m)%m;
  }
  return ans;
}
int main() {
  while(scanf("%d",&n)==1) {
  	for(int i=1;i<=n;i++)
      scanf("%lld %lld",&a[i],&r[i]);
    printf("%lld\n",EXCRT());
  }
  return 0;
}
2023/12/17 16:14
加载中...