【UOJ188】 Sanrd【类min_25筛】
題意:設f(i)f(i)f(i)表示iii的不嚴格次大質因子(沒有為000),求∑i=lrf(i)\sum_{i=l}^rf(i)∑i=lr?f(i)
l≤r≤1011l\leq r\leq10^{11}l≤r≤1011
這種和質因數有關的奇奇怪怪的函數的前綴和可以試試魔改min_25篩
設
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=2∑n?[minp(i)>pj?]f(i)
枚舉最小的質因子pkp_kpk?以及次數eee
如果pkp_kpk?不是次大質因子,直接遞歸到S(?npke?,k)S(\lfloor\frac{n}{p_k^e}\rfloor,k)S(?pke?n??,k)
否則考慮pkp_kpk?的貢獻
如果是嚴格次大,那么枚舉最大的質因子
否則就是[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+1∑pk?≤n??e=1∑pke?≤n?(S(?pke?n??,k)+i=pk?+1∑?pke?n???[i∈prime]+[e>1])
注意pk+1p_k+1pk?+1可能大于?npke?\lfloor\frac{n}{p_k^e}\rfloor?pke?n??,要特判一下
然后用min_25的方法預處理出質數個數的前綴和即可
#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; }總結
以上是生活随笔為你收集整理的【UOJ188】 Sanrd【类min_25筛】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ZJOI2018】历史【结论】【LCT
- 下一篇: SCOI2020游记