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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P6222 「P6156 简单题」(反演 + 积性函数线性筛)

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P6222 「P6156 简单题」(反演 + 积性函数线性筛) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P6156 簡單題

推式子

∑i=1n∑j=1n(i+j)kf(gcd(i,j))gcd(i,j)=∑i=1n∑j=1n(i+j)kμ2(gcd(i,j))gcd(i,j)=∑d=1nμ2(d)dk+1∑i=1nd∑j=1nd(i+j)k(gcd(i,j)==1)=∑d=1nμ2(d)dk+1∑p=1ndp2μ(p)∑i=1npd∑j=1npd(i+j)kt=pd,f(n)=∑i=1n∑j=1n(i+j)k=∑t=1nf(nt)tk∑d∣tμ2(d)μ(td)d\sum_{i = 1} ^{n} \sum_{j = 1} ^{n}(i + j) ^ kf(gcd(i, j))gcd(i, j)\\ = \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} (i + j) ^ k \mu ^ 2(gcd(i, j)) gcd(i, j)\\ = \sum_{d = 1} ^{n} \mu ^ 2 (d) d ^ {k + 1} \sum_{i = 1} ^{\frac{n}ozvdkddzhkzd} \sum_{j = 1} ^{\frac{n}ozvdkddzhkzd} (i + j) ^ k (gcd(i, j) == 1)\\ = \sum_{d = 1} ^{n} \mu ^ 2(d) d ^ {k + 1} \sum_{p = 1} ^{\frac{n}ozvdkddzhkzd} p ^ 2 \mu(p) \sum_{i = 1} ^{\frac{n}{pd}} \sum_{j = 1} ^{\frac{n}{pd}} (i + j) ^ k\\ t = pd, f(n) = \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} (i + j) ^ k \\ = \sum_{t = 1} ^{n} f(\frac{n}{t})t ^ k \sum_{d \mid t} \mu ^ 2(d) \mu(\frac{t}ozvdkddzhkzd) d\\ i=1n?j=1n?(i+j)kf(gcd(i,j))gcd(i,j)=i=1n?j=1n?(i+j)kμ2(gcd(i,j))gcd(i,j)=d=1n?μ2(d)dk+1i=1dn??j=1dn??(i+j)k(gcd(i,j)==1)=d=1n?μ2(d)dk+1p=1dn??p2μ(p)i=1pdn??j=1pdn??(i+j)kt=pd,f(n)=i=1n?j=1n?(i+j)k=t=1n?f(tn?)tkdt?μ2(d)μ(dt?)d

我們先對f(n)f(n)f(n)分析:
假定a(n)=∑i=1nik,b(n)=∑i=1n∑j=1ijk=∑i=1na(i)簡單化簡一下就可以得到f(n)=b(2n)?2b(n)顯然我們可以通過歐拉篩得到ik,然后一次前綴和得到a(i),再一次前綴和得到b(i)假定a(n) = \sum_{i = 1} ^{n} i ^ k,b(n) = \sum_{i = 1} ^{n} \sum_{j = 1} ^{i} j ^ k = \sum_{i = 1} ^{n} a(i) \\ 簡單化簡一下就可以得到f(n) = b(2n) - 2b(n)\\ 顯然我們可以通過歐拉篩得到i ^ k,然后一次前綴和得到a(i), 再一次前綴和得到b(i)\\ a(n)=i=1n?ikb(n)=i=1n?j=1i?jk=i=1n?a(i)f(n)=b(2n)?2b(n)ika(i),b(i)
接下來我們對f(n)=∑d∣nμ2(d)μ(nd)df(n) = \sum_{d \mid n} \mu^ 2(d) \mu(\frac{n}ozvdkddzhkzd)df(n)=dn?μ2(d)μ(dn?)d分析:
顯然這是一個積性函數,所以f(n)=f(pk)f(npk),當k=0,f(1)=1,當k=1,f(p)=p?1,當k=2,f(p2)=?p,當k>=3,顯然對任意一項d,或者nd一定有一項存在平方項,所以μ會變成0,所以k>=3f(pk)=0所以這個積性函數我們只要在歐拉篩中特判處理一下即可。顯然這是一個積性函數,所以f(n) = f(p ^ k) f(\frac{n}{p ^ k}),\\ 當k = 0, f(1) = 1,\\ 當k = 1, f(p) = p - 1,\\ 當k = 2, f(p ^ 2) = -p,\\ 當k >= 3,顯然對任意一項d,或者\frac{n}ozvdkddzhkzd一定有一項存在平方項,所以\mu會變成0,\\ 所以k >= 3 f(p ^ k) = 0\\ 所以這個積性函數我們只要在歐拉篩中特判處理一下即可。 f(n)=f(pk)f(pkn?)k=0,f(1)=1,k=1,f(p)=p?1,k=2,f(p2)=?p,k>=3ddn?μ0,k>=3f(pk)=0。

代碼

P6222 「P6156 簡單題」加強版

這道題目的加強版本,由于我這里采用的是線性復雜度的算法,所以只要稍加修改即可過這道題。

/*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h>#define mp make_pair #define pb push_back #define endl '\n' #define mid (l + r >> 1) #define lson rt << 1, l, mid #define rson rt << 1 | 1, mid + 1, r #define ls rt << 1 #define rs rt << 1 | 1using namespace std;typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii;const double pi = acos(-1.0); const double eps = 1e-7; const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x; }const int N = 1e7 + 10, mod = 998244353;int prime[N], cnt;ll f[N], pw[N], n, k;bool st[N];ll quick_pow(ll a, ll n) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans; }void init() {f[1] = pw[1] = 1;for(int i = 2; i < N; i++) {if(!st[i]) {prime[cnt++] = i;f[i] = i - 1;pw[i] = quick_pow(i, k);}for(int j = 0; j < cnt && i * prime[j] < N; j++) {pw[i * prime[j]] = pw[i] * pw[prime[j]] % mod;st[i * prime[j]] = 1;if(i % prime[j] == 0) {int temp = i / prime[j];if(temp % prime[j]) f[i * prime[j]] = (mod - 1ll * prime[j] * f[temp] % mod) % mod;break;}f[i * prime[j]] = f[i] * f[prime[j]] % mod;}}for(int i = 1; i < N; i++) f[i] = (f[i - 1] + f[i] * pw[i] % mod) % mod, pw[i] = (pw[i] + pw[i - 1]) % mod;for(int i = 1; i < N; i++) pw[i] = (pw[i] + pw[i - 1]) % mod; }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), k = read(), init();ll ans = 0;for(ll l = 1, r; l <= n; l = r + 1) {r = n / (n / l);ans = (ans + (f[r] - f[l - 1] + mod) % mod * (((pw[2 * (n / l)] - 2 * pw[n / l]) % mod + mod) % mod) % mod) % mod;}printf("%lld\n", ans);return 0; }

總結

以上是生活随笔為你收集整理的P6222 「P6156 简单题」(反演 + 积性函数线性筛)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。