博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】扩展中国剩余定理(EXCRT)
阅读量:5277 次
发布时间:2019-06-14

本文共 1300 字,大约阅读时间需要 4 分钟。

一、题目:

二、代码:

#include
#include
#include
#define LL long long#define mem(s,v) memset(s,v,sizeof(s))#define FILE(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)using namespace std;template
inline Type read(Type num){ Type x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f*x;}const int maxn=100005;int n;LL ai[maxn],bi[maxn];inline LL mult(LL a,LL b,LL p){ LL ret=0; for(;b;b>>=1){ if(b&1)ret=(ret+a)%p; a=(a+a)%p; } return ret;}inline LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){x=1;y=0;return a;} LL d=exgcd(b,a%b,x,y); LL z=x;x=y;y=z-a/b*y; return d;}inline LL excrt(void){ LL x,y; LL M=bi[1],ans=ai[1]; for(register int i=2;i<=n;++i){ LL a=M,b=bi[i],c=(ai[i]-ans%b+b)%b; LL gcd=exgcd(a,b,x,y),bg=b/gcd; if(c%gcd!=0)return -1; x=mult(x,c/gcd,bg); ans+=x*M; M*=bg; ans=(ans%M+M)%M; } return (ans%M+M)%M;}int main(){ n=read(n); for(register int i=1;i<=n;++i){ bi[i]=read(bi[i]); ai[i]=read(ai[i]); } printf("%lld\n",excrt()); return 0;}

转载于:https://www.cnblogs.com/little-aztl/p/9738718.html

你可能感兴趣的文章
Upload Image to .NET Core 2.1 API
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
Leetcode Balanced Binary Tree
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
寄Android开发Gradle你需要知道的知识
查看>>
css & input type & search icon
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
0320-学习进度条
查看>>
MetaWeblog API Test
查看>>