已知 n , x , y n,x,y n , x , y ,求:
∑ i = 1 n gcd ( i , n ) x lcm ( i , n ) y \sum_{i=1}^n \gcd(i,n)^x\text{lcm}(i,n)^y
i = 1 ∑ n g cd( i , n ) x lcm ( i , n ) y
n ≤ 1 0 18 , x , y ≤ 2000 n\le 10^{18},x,y\le 2000 n ≤ 1 0 1 8 , x , y ≤ 2 0 0 0
毒瘤题,多来点 。
先常规性地推导一下:
∑ i = 1 n gcd ( i , n ) x lcm ( i , n ) y = n y ∑ i = 1 n i y gcd ( i , n ) x − y = n y ∑ d ∣ n d x ∑ i = 1 n / d [ gcd ( i , n / d ) = 1 ] i y = n y ∑ d ∣ n d x ∑ p ∣ n d μ ( p ) p y S y ( n d p ) S y ( n ) = ∑ i = 1 n i y \sum_{i=1}^n \gcd(i,n)^x\text{lcm}(i,n)^y=n^y\sum_{i=1}^n i^y \gcd(i,n)^{x-y}\\
=n^y\sum_{d|n}d^x\sum_{i=1}^{n/d}[\gcd(i,n/d)=1]i^y\\
=n^y\sum_{d|n}d^x\sum_{p|\frac{n}{d}}\mu(p) p^yS^y(\frac{n}{dp})\\
S^y(n)=\sum_{i=1}^n i^y
i = 1 ∑ n g cd( i , n ) x lcm ( i , n ) y = n y i = 1 ∑ n i y g cd( i , n ) x − y = n y d ∣ n ∑ d x i = 1 ∑ n / d [ g cd( i , n / d ) = 1 ] i y = n y d ∣ n ∑ d x p ∣ d n ∑ μ ( p ) p y S y ( d p n ) S y ( n ) = i = 1 ∑ n i y
注意到等幂和是 y + 1 y+1 y + 1 次多项式,可以求出其系数,因此令:
S y ( n ) = ∑ i = 0 y + 1 B i n i n y ∑ d ∣ n d x ∑ p ∣ n d μ ( p ) p y S y ( n d p ) = n y ∑ d ∣ n d x ∑ p ∣ n d μ ( p ) p y ∑ i = 0 y + 1 B i n i d i p i = ∑ i = 0 y + 1 B i n y + i ∑ d ∣ n ∑ p ∣ n d d x − i μ ( p ) p y − i S^y(n)=\sum_{i=0}^{y+1} B_in^i\\
n^y\sum_{d|n}d^x\sum_{p|\frac{n}{d}}\mu(p) p^yS^y(\frac{n}{dp})=n^y\sum_{d|n}d^x\sum_{p|\frac{n}{d}}\mu(p) p^y\sum_{i=0}^{y+1}B_i\frac{n^i}{d^ip^i}\\
=\sum_{i=0}^{y+1}B_in^{y+i}\sum_{d|n}\sum_{p|\frac{n}{d}}d^{x-i}\mu(p)p^{y-i}
S y ( n ) = i = 0 ∑ y + 1 B i n i n y d ∣ n ∑ d x p ∣ d n ∑ μ ( p ) p y S y ( d p n ) = n y d ∣ n ∑ d x p ∣ d n ∑ μ ( p ) p y i = 0 ∑ y + 1 B i d i p i n i = i = 0 ∑ y + 1 B i n y + i d ∣ n ∑ p ∣ d n ∑ d x − i μ ( p ) p y − i
注意到后面的东西相当于是 d x , μ ( p ) p y , I d^x,\mu(p)p^y,I d x , μ ( p ) p y , I 三者的卷积,三个东西都是积性的,卷积结果也是积性的,因此直接对于每个质因子去求然后乘起来即可。
注意到有多测,等幂和的系数难以使用拉格朗日插值求出,只能使用伯努利数求,具体可以看 link 。
总复杂度 O ( y 2 + T ( n 1 / 4 + y ω ( n ) ) O(y^2+T(n^{1/4}+y\omega(n)) O ( y 2 + T ( n 1 / 4 + y ω ( n ) ) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 const int N = 3000 ;mint B[N + 5 ], C[N + 5 ][N + 5 ]; void init () { For (i, 0 , N + 1 ) { C[i][0 ] = 1 ; For (j, 1 , i) C[i][j] = C[i - 1 ][j - 1 ] + C[i - 1 ][j]; } For (i, 0 , N) { B[i] = !i; For (j, 0 , i - 1 ) B[i] -= C[i + 1 ][j] * B[j]; B[i] /= i + 1 ; } B[1 ] += 1 ; } void Yui_Yagi () { ll n; int X, Y; cin >> n >> X >> Y; V<pr> res = NT::work (n); V<mint> A (Y + 5 ) ; mint I = 1 _m / (Y + 1 ); For (i, 0 , Y) A[Y - i + 1 ] = B[i] * C[Y + 1 ][i] * I; mint ans = 0 ; For (i, 0 , Y + 1 ) { mint tmp = A[i] * (1 _m * n).pow (Y + i); for (auto j : res) { mint p = (1 _m * j.fi).pow (X - i), q = (1 _m * j.fi).pow (Y - i); mint sum = 0 , t = 1 ; For (x, 0 , j.se) sum += t, t *= p; t = -q; For (x, 0 , j.se - 1 ) sum += t, t *= p; tmp *= sum; } ans += tmp; } cout << ans << '\n' ; }