题目大意:
解题思路:
∑ i = 1 n [ g c d ( i , n ) = = 1 ] ∗ i d \sum_{i=1}^{n}[gcd(i,n)==1]*i^d ∑i=1n[gcd(i,n)==1]∗id
= ∑ i = 1 n ε ( g c d ( i , n ) ) ∗ i d =\sum_{i=1}^n\varepsilon (gcd(i,n))*i^d =∑i=1nε(gcd(i,n))∗id
= ∑ i = 1 n i d ∑ g ∣ i , g ∣ n μ ( g ) =\sum_{i=1}^ni^d\sum_{g|i,g|n}\mu(g) =∑i=1nid∑g∣i,g∣nμ(g)
= ∑ g ∣ n μ ( g ) ∑ i = 1 n k ( k i ) d =\sum_{g|n}\mu(g)\sum_{i=1}^{\frac nk}(ki)^d =∑g∣nμ(g)∑i=1kn(ki)d
=
∑
g
∣
n
μ
(
g
)
g
d
∑
i
=
1
n
k
i
d
=\sum_{g|n}\mu(g)g^d\sum_{i=1}^{\frac nk}i^d
=∑g∣nμ(g)gd∑i=1knid
由伯努利数
∑
i
=
1
n
k
i
d
=
∑
i
=
1
d
+
1
a
i
∗
(
n
p
)
i
\sum_{i=1}^{\frac nk}i^d=\sum_{i=1}^{d + 1}a_i*(\frac np)^i
∑i=1knid=∑i=1d+1ai∗(pn)i
a i = 1 d + 1 ∗ B d + 1 − i ∗ C d + 1 d + 1 − i a_i=\frac{1}{d+1}*B_{d+1-i}*C_{d+1}^{d+1-i} ai=d+11∗Bd+1−i∗Cd+1d+1−i
原式= ∑ i = 1 d + 1 a i ∑ g ∣ n μ ( g ) g d ∗ ( n g ) i \sum_{i=1}^{d+1}a_i\sum_{g|n}\mu(g)g^d*(\frac ng)^i ∑i=1d+1ai∑g∣nμ(g)gd∗(gn)i
又因为 ∑ g ∣ n μ ( g ) g d ∗ ( n g ) i \sum_{g|n}\mu(g)g^d*(\frac ng)^i ∑g∣nμ(g)gd∗(gn)i为积性函数,所以把每个质因子先计算再相乘即可
又对于 n = p c n=p^c n=pc时, ∑ g ∣ n μ ( g ) g d ∗ ( n g ) i = p c i − p c i + d − i \sum_{g|n}\mu(g)g^d*(\frac ng)^i=p^{ci}-p^{ci+d-i} ∑g∣nμ(g)gd∗(gn)i=pci−pci+d−i(当且仅当 μ ( 1 ) \mu(1) μ(1)与 μ ( p ) \mu(p) μ(p)有作用)
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 2e3 + 10;
const ll mod = 1e9 + 7;
ll c[maxn][maxn];
ll b[maxn], inv[maxn];
void init() {
for (ll i = 0; i < maxn; i++) {
c[i][0] = c[i][i] = 1;
for (ll k = 1; k < i; k++)
c[i][k] = (c[i - 1][k] + c[i - 1][k - 1]) % mod;
}
inv[1] = 1;
for (ll i = 2; i < maxn; i++)
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
b[0] = 1;
for (ll i = 1; i < maxn; i++) {
ll ans = 0;
if (i == maxn - 1) break;
for (ll k = 0; k < i; k++)
ans = (ans + c[i + 1][k] * b[k]) % mod;
ans = (ans * (-inv[i + 1]) % mod + mod) % mod;
b[i] = ans;
}
}
ll d, w;
ll a[maxn], p[maxn], alp[maxn];
void cal_a() {
for (ll i = 1; i <= d + 1; i++)
a[i] = inv[d + 1] * c[d + 1][d + 1 - i] % mod * b[d + 1 - i] % mod;
}
ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main() {
init();
cin >> d >> w;
cal_a();
for (ll i = 1; i <= w; i++)
cin >> p[i] >> alp[i];
ll ans = 0;
for (ll i = 1; i <= d + 1; i++) {
ll res = a[i] % mod;
for (ll j = 1; j <= w; j++) {
ll tmp = ((qpow(p[j], alp[j] * i) - qpow(p[j], d + (alp[j] - 1) * i)) % mod + mod) % mod;
res = res * tmp % mod;
}
ans = (ans + res) % mod;
}
cout << ans << endl;
}