社区讨论
为什么最后一个点过不去
P4777【模板】扩展中国剩余定理(EXCRT)参与者 4已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mi6vj38y
- 此快照首次捕获于
- 2025/11/20 11:30 4 个月前
- 此快照最后确认于
- 2025/11/20 11:30 4 个月前
#include
#include
long long n;
long long m[100010];
long long c[100010];
long long gcd(long long a,long long b)
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}
void exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,y,x);
y-=x*(a/b);
}
long long inv(long long a,long long b)
{
long long x,y;
exgcd(a,b,x,y);
x%=b;
x+=b;
x%=b;
return x;
}
int main()
{
memset(m,0,sizeof(m));
memset(c,0,sizeof(c));
scanf("%lld",&n);
for(long long i=1;i<=n;i++)
{
scanf("%lld %lld",&m[i],&c[i]);
}
for(long long i=2;i<=n;i++)
{
long long m1=m[i-1];
long long m2=m[i];
long long c1=c[i-1];
long long c2=c[i];
long long t=gcd(m1,m2);
if((c2-c1)%t!=0)
{
printf("-1\n");
return 0;
}
m[i]=m2/t;
m[i]=m1;
c[i]=((inv(m1/t,m2/t)%m[i])(((c2-c1)/t)%m[i]))%(m2/t)*m1+c1;
c[i]%=m[i];
c[i]+=m[i];
c[i]%=m[i];
}
printf("%lld\n",c[n]);
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...