BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数

Problem

传送门

Sol

容易得到
f n = e n − 1 + f n − 1 , e n − 1 = f n − 1 + e n − 1 , f 1 = e 1 = 1 f_n=e_{n-1}+f_{n-1},e_{n-1}=f_{n-1}+e_{n-1},f_1=e_1=1 fn=en1+fn1,en1=fn1+en1,f1=e1=1
那么
f n = 2 × ∑ i = 1 n − 1 f i − f n − 1 + 1 f_n=2\times \sum_{i=1}^{n-1}f_i-f_{n-1}+1 fn=2×i=1n1fifn1+1
又有
f n + 1 = 2 × ∑ i = 1 n f i − f n + 1 f_{n+1}=2\times \sum_{i=1}^{n}f_i-f_{n}+1 fn+1=2×i=1nfifn+1
相减得到 f n + 1 = f n × 2 + f n − 1 , f 1 = 1 f_{n+1}=f_n\times 2 + f_{n-1},f_1=1 fn+1=fn×2+fn1,f1=1

有结论 g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1 时,形如 f i = a f i − 1 + b f i − 2 f_i=af_{i-1}+bf_{i-2} fi=afi1+bfi2 的数列有性质 g c d ( f i , f j ) = f g c d ( i , j ) gcd(f_i,f_j)=f_{gcd(i,j)} gcd(fi,fj)=fgcd(i,j)

大概可以这么证明

l c m lcm lcm 实际上是一个对于质因子的指数取 m a x max max 的操作
每个质因子分开考虑,然后最值反演
l c m ( S ) = ∏ i p i ∑ T ⊂ S m i n ( T i ) ( − 1 ) ∣ T ∣ + 1 = ∏ i ∏ T ⊂ S p i m i n ( T i ) ( − 1 ) ∣ T ∣ + 1 lcm(S)=\prod_{i}p_i^{\sum_{T\subset S}min(T_i)(-1)^{|T|+1}}=\prod_{i}\prod_{T\subset S}p_i^{min(T_i)(-1)^{|T|+1}} lcm(S)=ipiTSmin(Ti)(1)T+1=iTSpimin(Ti)(1)T+1
交换顺序得到
l c m ( S ) = ∏ T ⊂ S g c d ( T ) ( − 1 ) ∣ T ∣ + 1 lcm(S)=\prod_{T \subset S}gcd(T)^{(-1)^{|T|+1}} lcm(S)=TSgcd(T)(1)T+1
其中 S , T ≠ ∅ S,T\ne \empty S,T̸= m i n ( T i ) min(T_i) min(Ti) 表示 p i p_i pi 这个因子的指数最小值

所以
g n = ∏ T ⊂ S f g c d ( T ) ( − 1 ) ∣ T ∣ + 1 = ∏ d = 1 n f d ∑ T ⊂ S [ g c d ( T ) = = d ] ( − 1 ) ∣ T ∣ + 1 g_n=\prod_{T \subset S}f_{gcd(T)}^{(-1)^{|T|+1}}=\prod_{d=1}^{n}f_{d}^{\sum_{T\subset S}[gcd(T)==d](-1)^{|T|+1}} gn=TSfgcd(T)(1)T+1=d=1nfdTS[gcd(T)==d](1)T+1
s d = ∑ T ⊂ S [ g c d ( T ) = = d ] ( − 1 ) ∣ T ∣ + 1 s_d=\sum_{T\subset S}[gcd(T)==d](-1)^{|T|+1} sd=TS[gcd(T)==d](1)T+1
h i = ∑ i ∣ d n s d = ∑ T ⊂ S [ i ∣ g c d ( T ) ] ( − 1 ) ∣ T ∣ + 1 = [ c n t i ≠ 0 ] = 1 h_i=\sum_{i|d}^{n}s_d=\sum_{T\subset S}[i|gcd(T)](-1)^{|T|+1}=[cnt_i\ne 0]=1 hi=idnsd=TS[igcd(T)](1)T+1=[cnti̸=0]=1
其中 c n t i cnt_i cnti 表示 i i i 的倍数的个数
那么
s i = ∑ i ∣ d n μ ( d i ) h d = ∑ i ∣ d n μ ( d i ) s_i=\sum_{i|d}^{n}\mu(\frac{d}{i})h_d=\sum_{i|d}^{n}\mu(\frac{d}{i}) si=idnμ(id)hd=idnμ(id)
那么
g n = ∏ d = 1 n f d ∑ d ∣ i n μ ( i d ) = ∏ d = 1 n ∏ d ∣ i n f d μ ( i d ) = ∏ i = 1 n ∏ d ∣ i f d μ ( i d ) g_n=\prod_{d=1}^{n}f_{d}^{\sum_{d|i}^{n}\mu(\frac{i}{d})}=\prod_{d=1}^{n}\prod_{d|i}^{n}f_d^{\mu(\frac{i}{d})}=\prod_{i=1}^{n}\prod_{d|i}f_d^{\mu(\frac{i}{d})} gn=d=1nfddinμ(di)=d=1ndinfdμ(di)=i=1ndifdμ(di)
Θ ( n l o g n ) \Theta(nlog n) Θ(nlogn) 预处理出 ∏ d ∣ i f d μ ( i d ) \prod_{d|i}f_d^{\mu(\frac{i}{d})} difdμ(di) 即可

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn(1e6 + 5);

int pr[maxn], num, ispr[maxn], mu[maxn], n, f[maxn], s[maxn], g[maxn], mod, ans, inv[maxn];

inline int Pow(ll x, int y) {
	register ll ret = 1;
	for (; y; y >>= 1, x = x * x % mod)
		if (y & 1) ret = ret * x % mod;
	return ret;
}

inline void Inc(int &x, int y) {
	if ((x += y) >= mod) x -= mod;
}

int main() {
	register int i, j, test;
	mu[1] = 1, ispr[1] = 1;
	for (i = 2; i <= 1000000; ++i) {
		if (!ispr[i]) pr[++num] = i, mu[i] = -1;
		for (j = 1; j <= num && i * pr[j] <= 1000000; ++j) {
			ispr[i * pr[j]] = 1;
			if (i % pr[j]) mu[i * pr[j]] = -mu[i];
			else {
				mu[i * pr[j]] = 0;
				break;
			}
		}
	}
	mod = 1e9 + 7;
	for (scanf("%d", &test); test; --test) {
		scanf("%d%d", &n, &mod), ans = 0;
		for (f[1] = 1, i = 2; i <= n; ++i) f[i] = (2LL * f[i - 1] + f[i - 2]) % mod;
		for (g[0] = i = 1; i <= n; ++i) g[i] = 0, s[i] = 1, inv[i] = Pow(f[i], mod - 2);
		for (i = 1; i <= n; ++i)
			for (j = i; j <= n; j += i)
				if (mu[j / i] == 1) s[j] = 1LL * s[j] * f[i] % mod;
				else if (mu[j / i] == -1) s[j] = 1LL * s[j] * inv[i] % mod;
		for (i = 1; i <= n; ++i) g[i] = 1LL * g[i - 1] * s[i] % mod;
		for (i = 1; i <= n; ++i) Inc(ans, 1LL * i * g[i] % mod);
		printf("%d\n", ans);
	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值