题意
- 令 ( 1 + 2 ) n = e ( n ) + 2 f ( n ) , g ( n ) = lcm ( f ( 1 ) , f ( 2 ) , . . . , f ( n ) ) (1+\sqrt 2)^n=e(n)+\sqrt 2f(n),g(n)=\text{lcm}(f(1),f(2),...,f(n)) (1+2)n=e(n)+2f(n),g(n)=lcm(f(1),f(2),...,f(n)),求 ∑ i = 1 n g ( i ) × i \sum\limits_{i = 1}^ng(i)\times i i=1∑ng(i)×i。( n ≤ 1 0 6 n\le10^6 n≤106)
挺巧妙的数学题,全程对着题解抄的,要推出来脑洞得足够大。
首先可以知道: f ( n ) = 2 f ( n − 1 ) + f ( n − 2 ) f(n)=2f(n-1)+f(n-2) f(n)=2f(n−1)+f(n−2)
引理一:对于 f ( n ) = a f ( n − 1 ) + b f ( n − 2 ) f(n)=af(n-1)+bf(n-2) f(n)=af(n−1)+bf(n−2) 形式的递推式,如果有 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1,那么 gcd ( f ( a ) , f ( b ) ) = f ( gcd ( a , b ) ) \gcd(f(a),f(b))=f(\gcd(a,b)) gcd(f(a),f(b))=f(gcd(a,b)),具体可以联系辗转相除的过程用归纳法证明。
引理二:
lcm
(
S
)
=
∏
T
⊂
S
(
−
1
)
∣
T
∣
+
1
gcd
(
T
)
(
T
≠
ϕ
)
\text{lcm}(S)=\prod_{T\subset S}(-1)^{|T|+1}\gcd(T)(T\neq\phi)
lcm(S)=T⊂S∏(−1)∣T∣+1gcd(T)(T̸=ϕ)
具体证明把
lcm
\text {lcm}
lcm 看做指数取最大值,
g
c
d
\rm gcd
gcd 看做指数取最小值,套用 Min-Max 容斥即可。
定义 U = { 1 , 2 , . . . , n } U=\{1,2,...,n\} U={1,2,...,n}, h h h 满足 f ( n ) = ∏ d ∣ n h ( d ) f(n)=\prod\limits_{d|n}h(d) f(n)=d∣n∏h(d),那么 h ( n ) = f ( n ) ∏ d ∣ n , d ≠ n h ( d ) h(n)=\frac{f(n)}{\displaystyle\prod_{d|n,d\neq n}h(d)} h(n)=d∣n,d̸=n∏h(d)f(n),我们可以 O ( n ln n ) O(n \ln n) O(nlnn) 枚举倍数计算。
由引理一和引理二可知:
g
(
n
)
=
∏
T
⊂
U
(
−
1
)
∣
T
∣
+
1
f
(
gcd
i
∈
T
i
)
g
(
n
)
=
∏
T
⊂
U
(
−
1
)
∣
T
∣
+
1
∏
d
∣
gcd
i
∈
T
i
h
d
g(n)=\prod_{T\subset U}(-1)^{|T|+1}f(\gcd_{i\in T}i)\\ g(n)=\prod_{T\subset U}(-1)^{|T|+1}\prod_{d|\gcd\limits_{i\in T}i}h_d
g(n)=T⊂U∏(−1)∣T∣+1f(i∈Tgcdi)g(n)=T⊂U∏(−1)∣T∣+1d∣i∈Tgcdi∏hd
设
S
d
=
{
d
,
2
d
,
.
.
.
,
⌊
n
d
⌋
}
S_d=\{d,2d,...,\lfloor\frac n d \rfloor\}
Sd={d,2d,...,⌊dn⌋},那么:
g
(
n
)
=
∏
d
=
1
n
h
d
∑
T
⊂
S
d
(
−
1
)
∣
T
∣
+
1
g(n)=\prod_{d = 1}^nh_d^{\sum\limits_{T\subset S_d}(-1)^{|T|+1}}
g(n)=d=1∏nhdT⊂Sd∑(−1)∣T∣+1
又因为 ∑ T ⊂ S d ( − 1 ) ∣ T ∣ + 1 = ∑ i = 1 ∣ S d ∣ ( − 1 ) i + 1 ( ∣ S d ∣ i ) \sum\limits_{T\subset S_d}(-1)^{|T|+1}=\sum\limits_{i = 1}^{|S_d|}(-1)^{i+1}\binom {|S_d|} i T⊂Sd∑(−1)∣T∣+1=i=1∑∣Sd∣(−1)i+1(i∣Sd∣),由二项式定理可知后面这个东西等于一,所以 g ( n ) = ∏ d = 1 n h d g(n)=\prod\limits_{d = 1}^nh_d g(n)=d=1∏nhd。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int T, n, Mod, h[N], f[N];
inline int qpow(int a, int x)
{
int ret = 1;
for (; x; x >>= 1, a = 1ll * a * a % Mod)
if (x & 1) ret = 1ll * ret * a % Mod;
return ret;
}
int main()
{
#ifdef ylsakioi
freopen("4833.in", "r", stdin);
freopen("4833.out", "w", stdout);
#endif
f[0] = 0, f[1] = h[1] = 1;
for (scanf("%d", &T); T -- ; )
{
scanf("%d%d", &n, &Mod);
for (int i = 2; i <= n; ++ i)
h[i] = f[i] = (2ll * f[i - 1] + f[i - 2]) % Mod;
for (int i = 2; i <= n; ++ i)
{
int d = qpow(h[i], Mod - 2);
for (int j = i << 1; j <= n; j += i)
h[j] = 1ll * h[j] * d % Mod;
}
int ans = 0, ret = 1;
for (int i = 1; i <= n; ++ i)
{
ret = 1ll * ret * h[i] % Mod;
(ans += 1ll * ret * i % Mod) %= Mod;
}
printf("%d\n", ans);
}
return 0;
}