记录编号 138021 评测结果 AAAAAAAAAA
题目名称 韩信点兵 最终得分 100
用户昵称 GravatarIostream3100 是否通过 通过
代码语言 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;
}