比赛 |
20141105 |
评测结果 |
AAAAAAAAAA |
题目名称 |
韩信点兵 |
最终得分 |
100 |
用户昵称 |
sqyon |
运行时间 |
0.002 s |
代码语言 |
C++ |
内存使用 |
0.29 MiB |
提交时间 |
2014-11-05 10:46:13 |
显示代码纯文本
#include <cstdio>
#include <queue>
#define maxn 15
#define LL long long
using namespace std;
LL n, N, M, m[maxn], a[maxn], ans;
bool flag;
void gcd(LL a, LL b, LL &x, LL &y)
{
if (!b)
{
x = 1;
y = 0;
return ;
}
gcd(b, a % b, y, x);
y -= x * (a / b);
return ;
}
inline void init()
{
M = 1;
scanf("%lld %lld", &N, &n);
for (int i = 0; i < n; i++)
{
scanf("%lld %lld", m + i, a + i);
M *= m[i];
if (m[i])
flag = true;
}
return ;
}
inline void CRT()
{
LL w, x, y;
for (int i = 0; i < n; i++)
{
w = M / m[i];
gcd(w, m[i], x, y);
ans = (ans + a[i] * w * x) % M;
}
return ;
}
int main()
{
freopen("HanXin.in", "r", stdin);
freopen("HanXin.out", "w", stdout);
init();
if (!flag)
{
printf("-1");
return 0;
}
CRT();
while (ans + M <= N)
ans += M;
if (ans > N)
{
printf("-1");
return 0;
}
printf("%lld", N - ans);
return 0;
}