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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【UOJ188】 Sanrd【类min_25筛】

發(fā)布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【UOJ188】 Sanrd【类min_25筛】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:設(shè)f(i)f(i)f(i)表示iii的不嚴格次大質(zhì)因子(沒有為000),求∑i=lrf(i)\sum_{i=l}^rf(i)i=lr?f(i)

l≤r≤1011l\leq r\leq10^{11}lr1011

這種和質(zhì)因數(shù)有關(guān)的奇奇怪怪的函數(shù)的前綴和可以試試魔改min_25篩

設(shè)

S(n,j)=∑i=2n[minp(i)>pj]f(i)S(n,j)=\sum_{i=2}^n[minp(i)>p_j]f(i)S(n,j)=i=2n?[minp(i)>pj?]f(i)

枚舉最小的質(zhì)因子pkp_kpk?以及次數(shù)eee

如果pkp_kpk?不是次大質(zhì)因子,直接遞歸到S(?npke?,k)S(\lfloor\frac{n}{p_k^e}\rfloor,k)S(?pke?n??,k)

否則考慮pkp_kpk?的貢獻

如果是嚴格次大,那么枚舉最大的質(zhì)因子

否則就是[e>1][e>1][e>1]

S(n,j)=∑k=j+1pk≤n∑e=1pke≤n(S(?npke?,k)+∑i=pk+1?npke?[i∈prime]+[e>1])S(n,j)=\sum_{k=j+1}^{p_k\leq\sqrt n}\sum_{e=1}^{p_k^e\leq n}(S(\lfloor\frac{n}{p_k^e}\rfloor,k)+\sum_{i=p_k+1}^{\lfloor\frac{n}{p_k^e}\rfloor}[i\in prime]+[e>1])S(n,j)=k=j+1pk?n??e=1pke?n?(S(?pke?n??,k)+i=pk?+1?pke?n???[iprime]+[e>1])

注意pk+1p_k+1pk?+1可能大于?npke?\lfloor\frac{n}{p_k^e}\rfloor?pke?n??,要特判一下

然后用min_25的方法預(yù)處理出質(zhì)數(shù)個數(shù)的前綴和即可

#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <cmath> #define MAXN 1000005 using namespace std; const int N=1e6; int np[MAXN],pl[MAXN],cnt; void init() {np[1]=1;for (int i=2;i<=N;i++){if (!np[i]) pl[++cnt]=i;for (int j=1,x;(x=i*pl[j])<=N;j++){np[x]=1;if (i%pl[j]==0) break;}} } typedef long long ll; ll val[MAXN],n,m; int key[MAXN],yek[MAXN],tot; inline int getkey(ll x){return x<=m? key[x]:yek[n/x];} ll g[MAXN]; ll S(ll n,int j) {if ((ll)pl[j]*pl[j]>n) return 0;ll sum=0;for (int k=j+1;(ll)pl[k]*pl[k]<=n&&k<=cnt;k++)for (ll e=1,v=pl[k];v<=n;e++,v*=pl[k])sum+=S(n/v,k)+pl[k]*(max(0ll,g[getkey(n/v)]-k)+(e>1));return sum; } ll solve(ll N) {m=sqrt(n=N);tot=0;for (ll l=1,r;l<=n;l=r+1){r=n/(n/l);val[++tot]=n/l;if (val[tot]<=m) key[val[tot]]=tot;else yek[n/val[tot]]=tot;}for (int i=1;i<=tot;i++) g[i]=val[i]-1;for (int j=1;j<=cnt;j++)for (int i=1;(ll)pl[j]*pl[j]<=val[i];i++)g[i]-=g[getkey(val[i]/pl[j])]-j+1;return S(n,0); } int main() {init();ll l,r;cin>>l>>r;cout<<solve(r)-solve(l-1);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【UOJ188】 Sanrd【类min_25筛】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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