社区讨论

为什么最后一个点过不去

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 条回复,欢迎继续交流。

正在加载回复...