比赛 |
20141105 |
评测结果 |
AAAWWWWWWW |
题目名称 |
韩信点兵 |
最终得分 |
30 |
用户昵称 |
ggwdwsbs |
运行时间 |
0.009 s |
代码语言 |
C++ |
内存使用 |
0.29 MiB |
提交时间 |
2014-11-05 11:56:46 |
显示代码纯文本
#include<stdio.h>
long long gcd(long long x,long long y)
{
if(y==0) return x;
else return gcd(y,x%y);
}
long long exgcd(long long a,long long b,long long &d,long long &x,long long &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
long long abs(long long x)
{
if(x>0) return x;
else return -x;
}
long long a,b,d1,x1,y1;
int get(int a,int b)
{
//scanf("%d%d",&a,&b);
exgcd(a,-b,d1,x1,y1);
x1=x1*(1/d1);
int a1=a/d1;
int b1=b/d1;
b1=abs(b1);
while(x1<=0)
{
x1+=b1;
}
while(x1>b1)
{
x1-=b1;
}
return x1;
//printf("%d",x1);
//while(1);
}
long long n,m;
long long p[101];
long long mod[101];
long long ans=1;
int main()
{
freopen("HanXin.in","r",stdin);
freopen("HanXin.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&p[i],&mod[i]);
ans*=p[i];
}
//printf("%lld\n",ans);
long long x=0;
long long ret=0;
for(int i=1;i<=m;i++)
{
if(gcd(ans/p[i],p[i])!=1)
{
printf("-1");
//printf("%lld %d\n",ans,100);
//printf("%d",gcd(ans/p[i],p[i]));/;
//while(1);
return 0;
}
//printf("%lld\n",ans);
x=get(ans/p[i],p[i])*ans/p[i];
//printf("%d\n",x);
ret+=x*mod[i];
}
//printf("%d\n",ret);
long long l=0,r=n/ans;
while(l<r)
{
//printf("%d ",l);
//printf("%d\n",r);
int mid=(l+r)/2;
//printf("%d\n",ret+ans*mid);
if(n>ret+ans*mid) l=mid+1;
if(n<ret+ans*mid) r=mid;
}
printf("%lld",n-(ret+ans*(l-1)));
//while(1);
}