记录编号 |
138021 |
评测结果 |
AAAAAAAAAA |
题目名称 |
韩信点兵 |
最终得分 |
100 |
用户昵称 |
Iostream3100 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2014-11-05 16:08:57 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
LL N,M,ans,m[100],a[100],x=10000000000000;
LL gcd(LL a,LL b){ return b==0? a: gcd(b,a%b); }
LL lcd(LL a,LL b){ return a*b/gcd(a,b); }
LL extend_gcd(LL a,LL b,LL &x, LL &y){
if(!b){
x=1;
y=0;
return a;
}
else{
LL r=extend_gcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
}
LL CRT(LL a[],LL m[],LL N){
LL MM=1;
for(int i=1;i<=N;++i) MM*=m[i];
LL ret=0;
for(int i=1;i<=N;++i){
LL x,y;
LL tm=MM/m[i];
extend_gcd(tm,m[i],x,y);
ret=(ret+tm*x*a[i])%MM;
}
return (ret+MM)%MM;
}
int main(){
std::ios::sync_with_stdio(false);
freopen("HanXin.in","r",stdin);
freopen("HanXin.out","w",stdout);
cin>>N>>M;
LL mul=1;
for(LL i=1;i<=M;++i){
cin>>m[i]>>a[i];
mul*=m[i];
}
x=CRT(a,m,M);
if(x<=N) cout<<(N-x)%mul<<endl;//一定要mod素数的乘积!!
else cout<<-1<<endl;
}