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

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

 

1 //minamoto 2 #include
3 #include
4 #define int long long 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 int read(){ 9 #define num ch-'0'10 char ch;bool flag=0;int res;11 while(!isdigit(ch=getc()))12 (ch=='-')&&(flag=true);13 for(res=num;isdigit(ch=getc());res=res*10+num);14 (flag)&&(res=-res);15 #undef num16 return res;17 }18 const int N=1e5+5;19 int n,ai[N],bi[N];20 int mul(int a,int b,int mod){21 int res=0;22 while(b){23 if(b&1) res=(res+a)%mod;24 a=(a+a)%mod,b>>=1;25 }26 return res;27 }28 int exgcd(int a,int b,int &x,int &y){29 if(b==0) return x=1,y=0,a;30 int gcd=exgcd(b,a%b,x,y),t=x;31 x=y,y=t-a/b*y;return gcd;32 }33 int excrt(){34 int x,y,k,M=bi[1],ans=ai[1];35 for(int i=2;i<=n;++i){36 int a=M,b=bi[i],c=(ai[i]-ans%b+b)%b;37 int gcd=exgcd(a,b,x,y),bg=b/gcd;38 if(c%gcd!=0) return -1;39 x=mul(x,c/gcd,bg);40 ans+=x*M,M*=bg,ans=(ans%M+M)%M;41 }42 return (ans%M+M)%M;43 }44 signed main(){45 // freopen("testdata.in","r",stdin);46 n=read();47 for(int i=1;i<=n;++i) bi[i]=read(),ai[i]=read();48 printf("%lld\n",excrt());49 return 0;50 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9824646.html

你可能感兴趣的文章
【多媒体封装格式详解】--- AAC ADTS格式分析
查看>>
联想IDEAPAD 320C-15笔记本显卡驱动问题
查看>>
ES6简介
查看>>
UWP FillRowViewPanel
查看>>
目前的.NET(C#)世界里,主流的ORM框架
查看>>
Java 基础知识点
查看>>
Linux--忘记MySQL密码的解决方法和输入mysqld_safe --skip-grant-tables &后无法进入MySQL的解决方法...
查看>>
vimperator
查看>>
(原創) 如何使用boost::array? (C/C++) (template) (boost)
查看>>
Oracle for Windows 相关下载地址
查看>>
电子书下载:Microsoft Silverlight 4 Business Application Development: Beginners Guide
查看>>
.Net下RabbitMQ的使用(2) -- 发送接收消息
查看>>
2009年云数据库的开发和应用前景(转载)
查看>>
Some key terms of Data Mining
查看>>
咏南中间件更新日志
查看>>
9-1让我想起了学生时代~~
查看>>
谷歌用户体验设计准则
查看>>
LaTeX中的数学公式
查看>>
计算二重定积分
查看>>
asp.net Web项目中c#读取域用户名的方法
查看>>