求小于
只差一步......
关于
记
square-free-number
时非 0, 所以
于是, 忽略快速幂的时间复杂度, 本题以
注意,
typedef long long ll;
const int W = 1000, K = 100, MOD = 1e9 + 7;
ll fpm(ll x, int n)
{
ll y = 1;
for (; n; n >>= 1, (x *= x) %= MOD)
if (n & 1)
(y *= x) %= MOD;
return y;
}
struct Gauss
{
ll a[K+1][K+2];
void main(int n)
{
rep (i, 0, n)
{
int r = i;
while (r < n && !a[r][i]) ++r;
assert(r != n);
if (r != i) rep (k, i, n+1) swap(a[i][k], a[r][k]);
ll t = fpm(a[i][i], MOD-2);
rep (k, i, n+1) (a[i][k] *= t) %= MOD;
rep (j, i+1, n) if (a[j][i])
per (k, n, i) (a[j][k] -= a[j][i] * a[i][k]) %= MOD;
}
per (i, n-2, 0) rep (j, i+1, n+1)
(a[i][n] -= a[i][j] * a[j][n]) %= MOD;
}
} G;
int h[K+1];
int main()
{
int k, w, ans = 0, n = 1, p, a;
scanf("%d%d", &k, &w);
fill_n(h, k+1, 1);
rep (i, 0, w)
{
scanf("%d%d", &p, &a);
n = n * fpm(p, a) % MOD;
ll t = fpm(p, MOD-2) % MOD;
per (j, k, 0)
h[j] = 1LL * h[j] * (1-t) % MOD, (t *= p) %= MOD;
}
ll m = n;
rep (i, 0, k+1)
h[i] = h[i] * m % MOD, (m *= n) %= MOD;
rep (i, 0, k+1)
{
G.a[i][0] = i+1;
rep (j, 1, k+1) G.a[i][j] = G.a[i][j-1] * (i+1) % MOD;
G.a[i][k+1] = i ? (G.a[i-1][k+1] + G.a[i][k-1]) % MOD : 1;
}
G.main(k+1);
rep (i, 0, k+1) ans = (ans + G.a[i][k+1] * h[i]) % MOD;
printf("%d\n", (ans + MOD) % MOD);
return 0;
}