日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Problem

傳送門

Sol

容易得到
fn=en?1+fn?1,en?1=fn?1+en?1,f1=e1=1f_n=e_{n-1}+f_{n-1},e_{n-1}=f_{n-1}+e_{n-1},f_1=e_1=1fn?=en?1?+fn?1?,en?1?=fn?1?+en?1?,f1?=e1?=1
那么
fn=2×∑i=1n?1fi?fn?1+1f_n=2\times \sum_{i=1}^{n-1}f_i-f_{n-1}+1fn?=2×i=1n?1?fi??fn?1?+1
又有
fn+1=2×∑i=1nfi?fn+1f_{n+1}=2\times \sum_{i=1}^{n}f_i-f_{n}+1fn+1?=2×i=1n?fi??fn?+1
相減得到 fn+1=fn×2+fn?1,f1=1f_{n+1}=f_n\times 2 + f_{n-1},f_1=1fn+1?=fn?×2+fn?1?,f1?=1

有結(jié)論 gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1 時,形如 fi=afi?1+bfi?2f_i=af_{i-1}+bf_{i-2}fi?=afi?1?+bfi?2? 的數(shù)列有性質(zhì) gcd(fi,fj)=fgcd(i,j)gcd(f_i,f_j)=f_{gcd(i,j)}gcd(fi?,fj?)=fgcd(i,j)?

大概可以這么證明

lcmlcmlcm 實(shí)際上是一個對于質(zhì)因子的指數(shù)取 maxmaxmax 的操作
每個質(zhì)因子分開考慮,然后最值反演
lcm(S)=∏ipi∑T?Smin(Ti)(?1)∣T∣+1=∏i∏T?Spimin(Ti)(?1)∣T∣+1lcm(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)=i?piT?S?min(Ti?)(?1)T+1?=i?T?S?pimin(Ti?)(?1)T+1?
交換順序得到
lcm(S)=∏T?Sgcd(T)(?1)∣T∣+1lcm(S)=\prod_{T \subset S}gcd(T)^{(-1)^{|T|+1}}lcm(S)=T?S?gcd(T)(?1)T+1
其中 S,T≠?S,T\ne \emptyS,T??=?min(Ti)min(T_i)min(Ti?) 表示 pip_ipi? 這個因子的指數(shù)最小值

所以
gn=∏T?Sfgcd(T)(?1)∣T∣+1=∏d=1nfd∑T?S[gcd(T)==d](?1)∣T∣+1g_n=\prod_{T \subset S}f_{gcd(T)}^{(-1)^{|T|+1}}=\prod_{d=1}^{n}f_ozvdkddzhkzd^{\sum_{T\subset S}[gcd(T)==d](-1)^{|T|+1}}gn?=T?S?fgcd(T)(?1)T+1?=d=1n?fdT?S?[gcd(T)==d](?1)T+1?
設(shè) sd=∑T?S[gcd(T)==d](?1)∣T∣+1s_d=\sum_{T\subset S}[gcd(T)==d](-1)^{|T|+1}sd?=T?S?[gcd(T)==d](?1)T+1
hi=∑i∣dnsd=∑T?S[i∣gcd(T)](?1)∣T∣+1=[cnti≠0]=1h_i=\sum_{i|d}^{n}s_d=\sum_{T\subset S}[i|gcd(T)](-1)^{|T|+1}=[cnt_i\ne 0]=1hi?=idn?sd?=T?S?[igcd(T)](?1)T+1=[cnti???=0]=1
其中 cnticnt_icnti? 表示 iii 的倍數(shù)的個數(shù)
那么
si=∑i∣dnμ(di)hd=∑i∣dnμ(di)s_i=\sum_{i|d}^{n}\mu(\fracozvdkddzhkzd{i})h_d=\sum_{i|d}^{n}\mu(\fracozvdkddzhkzd{i})si?=idn?μ(id?)hd?=idn?μ(id?)
那么
gn=∏d=1nfd∑d∣inμ(id)=∏d=1n∏d∣infdμ(id)=∏i=1n∏d∣ifdμ(id)g_n=\prod_{d=1}^{n}f_ozvdkddzhkzd^{\sum_{d|i}^{n}\mu(\frac{i}ozvdkddzhkzd)}=\prod_{d=1}^{n}\prod_{d|i}^{n}f_d^{\mu(\frac{i}ozvdkddzhkzd)}=\prod_{i=1}^{n}\prod_{d|i}f_d^{\mu(\frac{i}ozvdkddzhkzd)}gn?=d=1n?fddin?μ(di?)?=d=1n?din?fdμ(di?)?=i=1n?di?fdμ(di?)?
Θ(nlogn)\Theta(nlog n)Θ(nlogn) 預(yù)處理出 ∏d∣ifdμ(id)\prod_{d|i}f_d^{\mu(\frac{i}ozvdkddzhkzd)}di?fdμ(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; }

總結(jié)

以上是生活随笔為你收集整理的BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。