pu+q(-d)=ans>1&&ans尽量小
//D=gcd(u,d) D|ans 则枚举ans,logn 判断ans是否满p+q=n ,pu+q(-d)=ans
//二分求出p即可 总的时间复杂度O(mlog(n)log(n))
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=1e6+20;
const int mod=1e4+7;
const ll inf=1<<30;
int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
ll n,m,u[N],d[N];
bool check(ll x,int i)
{
int l=1,r=n;//p的取值满足单调性,p<x 则增大p 大于x 减小p,二分出p
while(l<=r)
{
int mid=(l+r)/2;
int q=n-mid;
if(mid*u[i]-q*d[i]<=x)
{
if(mid*u[i]-q*d[i]==x)
return true;
l=mid+1;
}
else
{
r=mid-1;
}
}
return false;
}
int main()
{
while(cin>>n>>m)
{
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&u[i],&d[i]);
}
ll ans=inf;
for(int i=1;i<=m;i++)
{
// pu+q(-d)=ans>1&&ans尽量小
//p+q=n //n steps;
int D=gcd(u[i],d[i]);
for(int t=D;D<n*u[i];t+=D)
{
if(check(t,i)||ans<t)
{
ans=min(ans,(ll)t);
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}