题目:https://loj.ac/problem/6053

min_25筛:https://www.cnblogs.com/cjyyb/p/9185093.html

这里把计算 s( n , j ) 需要的“质数部分的贡献”分成两部分算,令 \( g(n,j)=\sum\limits_{i=1}^{n}[i \in P or min_i > p_j]i \) , \( h(n,j)=\sum\limits_{i=1}^{n}[i \in P or min_i > p_j]1 \) ,其中 P 表示质数集合,\( min_i \) 表示 i 的最小质因子。

注意空间是两倍 sqrt(n) 。注意有些地方是 long long 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N=1e5+,mod=1e9+;
//int upt(int x){if(x>=mod)x-=mod;if(x<0)x+=mod;return x;}
int upt(ll x){if(x>=mod)x-=mod;if(x<)x+=mod;return x;} int m,g[N<<],h[N<<],s[N<<],p[N],cnt,sm[N],base;//[N<<1]!!!!!not[N]
ll n,w[N<<],p2[N];bool vis[N];//w[N<<1]!!!!!not [N]
void get_pri(int n)
{
for(int i=;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i;p2[cnt]=(ll)i*i;
sm[cnt]=upt(sm[cnt-]+i);
}
for(int j=,d;j<=cnt&&(d=i*p[j])<=n;j++)
{vis[d]=; if(i%p[j]==)break;}
}
}
int Id(ll x){if(x<=base)return m-x+; else return n/x;}//<= not <
void cz1()
{
for(int j=;j<=cnt;j++)
for(int i=;i<=m&&w[i]>=p2[j];i++)
{
int k=Id(w[i]/p[j]);
g[i]=upt( g[i]-(ll)p[j]*upt(g[k]-sm[j-])%mod );
h[i]=upt( h[i]-upt(h[k]-(j-)) );
}
}
int S(ll x,int y)
{
if(x<=||p[y]>x)return ;
int k=Id(x),ret=upt(upt(g[k]-h[k])-upt(sm[y-]-(y-)));
if(y==)ret=upt(ret+);
for(int i=y;i<=cnt&&p2[i]<=x;i++)
{
ll m1=p[i],m2=p2[i];
for(int t=;m2<=x;t++,m1=m2,m2*=p[i])
ret=( ret + (ll)(p[i]^t)*S(x/m1,i+) + (p[i]^(t+)) )%mod;//i+1!!
}
return ret;
}
int main()
{
scanf("%lld",&n);base=sqrt(n);
get_pri(base);
for(ll i=,j;i<=n;i=n/j+)
{
j=n/i; w[++m]=j;
g[m]=(j-)%mod*((j+)%mod)%mod;
if(g[m]&)g[m]+=mod; g[m]>>=;
h[m]=(j-)%mod;/////////
}
cz1();printf("%d\n",upt(S(n,)+));
return ;
}

UPD(2019.4.3):

一些理解:之所以只用 \( <= \sqrt{n} \) 的质数可以得到所有质数的答案,是靠初值。初值里包含了 \( > \sqrt{n} \) 的质数的答案,之后再把合数的答案筛掉,剩下的就是所有质数的答案。

     所以一开始算所有质数答案的时候,给合数赋错误的值也可以,只要满足质数上的值是正确的,并且赋值函数满足积性。一般把合数当做质数看待来赋初值。

     筛合数也只用到 \( <= \sqrt{n} \) 的内容。因为一个合数的 mindiv 一定是 \( <= \sqrt{n} \) 的质数。

并且尝试了另一种写法。

在计算 s( n , j ) 的时候,可以写成非递归的,式子就是 \( s(n,j)=s(n,j+1)+ f(p_j) + \sum\limits_{t=1}^{p_j^{t+1}<=n} f(p_j^{t+1}) * s( \frac{n}{p_j^t} , j+1 ) \) 。

当 \( p_j^2 > n \) 的时候 s( n , j ) 是没有赋值的。这时候如果要用,就判断一下;因为没有赋值说明此时它的值只有质数部分的,所以用 g 和 h 拼一下即可。

随着 j 变小,有赋值的 n 可以越来越小,用一个指针指一下即可。

好像比递归版慢。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N=2e5+,mod=1e9+;//2e5 not 1e5!!
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} ll n,w[N],p2[N];int m,bs,p[N],cnt;
int sm[N],g[N],h[N],s[N]; bool vis[N];
void init(int n)
{
ll d;
for(int i=;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i; p2[cnt]=(ll)i*i;
sm[cnt]=upt(sm[cnt-]+i);
}
for(int j=;j<=cnt&&(d=(ll)i*p[j])<=n;j++)
{ vis[d]=; if(i%p[j]==)break;}
}
}
int Id(ll x){return x>bs?n/x:m-x+;}
int cz(int i,int j)
{
if(i==m)return ;//
if(vis[i])return s[i];
return (upt(g[i]-h[i]+(j==?:))-sm[j-]+(j-));
}
void solve()
{
for(int j=;j<=cnt;j++)
for(int i=;i<=m&&w[i]>=p2[j];i++)
{
int k=Id(w[i]/p[j]);
g[i]=upt(g[i]-(ll)p[j]*(g[k]-sm[j-])%mod);
h[i]=upt(upt(h[i]-h[k])+(j-));
} memset(vis,,sizeof vis);
int p0=;
for(int j=cnt;j;j--)
{
while(p0<m&&w[p0+]>=p2[j])
{
p0++;vis[p0]=;
s[p0]=upt(upt(g[p0]-h[p0])-sm[j]+j);//S(..,j+1)
}
for(int i=;i<=p0;i++)
{
ll m1=p[j], m2=p2[j]; s[i]=upt(s[i]+(p[j]^));
for(int t=;m2<=w[i];t++,m1=m2,m2*=p[j])
s[i]=(s[i]+(ll)(p[j]^t)*cz(Id(w[i]/m1),j+)+(p[j]^(t+)))%mod;
}
}
}
int S(ll n,int j)
{
if(p[j]>n||n==)return ; int cr=Id(n);
int ret=upt(upt(g[cr]-h[cr]+(j==?:))-sm[j-]+(j-));
for(int k=j;k<=cnt&&p2[k]<=n;k++)//k<=cnt
{
ll m1=p[k], m2=p2[k];
for(int t=;m2<=n;t++,m1=m2,m2*=p[k])
{
ret=(ret+(ll)(p[k]^t)*S(n/m1,k+)+(p[k]^(t+)))%mod;
}
}
return ret;
}
int main()
{
scanf("%lld",&n); bs=sqrt(n);
init(bs); int iv2=pw(,mod-);
for(ll i=,j;i<=n;i=n/j+)
{
j=n/i; w[++m]=j;
g[m]=(+j)%mod*((j-)%mod)%mod*iv2%mod;
///// not (2+j)%mod*(j-1)%mod*iv2%mod!!!
h[m]=(j-)%mod;
}
solve(); printf("%d\n",upt(s[]+));
return ;
}

LOJ 6053 简单的函数——min_25筛的更多相关文章

  1. LOJ.6053.简单的函数(Min_25筛)

    题目链接 Min_25筛见这里: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushuyu/p/91 ...

  2. loj 6053 简单的函数 —— min_25筛

    题目:https://loj.ac/problem/6053 参考博客:http://www.cnblogs.com/zhoushuyu/p/9187319.html 算 id 也可以不存下来,因为 ...

  3. loj#6053. 简单的函数(Min_25筛)

    传送门 题解 \(Min\_25\)筛有毒啊--肝了一个下午才看懂是个什么东西-- \(zsy\)巨巨强无敌-- //minamoto #include<bits/stdc++.h> #d ...

  4. 简单的函数——Min_25筛

    %%yyb %%zsy 就是实现一下Min-25筛 筛积性函数的操作 首先要得到 $G(M,j)=\sum_{t=j}^{cnt} \sum_{e=1}^{p_t^{e+1}<=M} [\phi ...

  5. LOJ #6053. 简单的函数

    $Min$_$25$筛模版题 为什么泥萌常数都那么小啊$ QAQ$ 传送门:Here 题意: $ f(1)=1$$ f(p^c)=p⊕c(p 为质数,⊕ 表示异或)$$ f(ab)=f(a)f(b)( ...

  6. LOJ.6235.区间素数个数(Min_25筛)

    题目链接 \(Description\) 给定\(n\),求\(1\sim n\)中的素数个数. \(2\leq n\leq10^{11}\). \(Solution\) Min_25筛.只需要求出\ ...

  7. LOJ #6202. 叶氏筛法(min_25 筛)

    题意 求 \([L, R]\) 之间的素数之和 . \(L≤10^{10},2×10^{10} \le R \le 10^{11}\) 题解 一个有点裸的 min_25筛 ? 现在我只会筛素数的前缀和 ...

  8. min_25筛

    min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...

  9. 「算法笔记」Min_25 筛

    戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...

随机推荐

  1. 第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)

    本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序. 笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序.(对于一些未进行解释的内容,笔者提供了 ...

  2. OAF 功能中的参数含义

    OA.jsp?OAFunc=POS_HT_SP_B_SUPP&OAPB=POS_SM_PRODUCT_BRANDING&OAHP=POS_SM_ADMIN_HOME&OASF= ...

  3. JavaScript学习总结(六)——JavaScript判断数据类型总结

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断,在此做一个总结吧! 一.JS中的数据类型 1.数值型(Number):包括整数.浮 ...

  4. 在Ubuntu系统下设置永久性Swap交换空间(转帖)

    http://blog.sina.com.cn/s/blog_6e4388910100tsk7.html swap 一般都在一个专有的swap区里,这可能是因为在安装的时候系统会提示你创建一个swap ...

  5. 怎样设置IIS6.0的闲置超时时间

    打开IIS 信息服务管理器 1)打开IIS,点击应用程序池 2)找到Bs项目使用具体程序池(DspTest) 3)右键属性找到高级设置-- 进程模型 -- 闲置超时 4)设置闲置超时时间(默认为20分 ...

  6. 关于python课程的想法和建议。

    第一次听说python是在刚结束与世隔绝的高中生活之后,当时的网络上铺天遍地都是人工智能和机器学习,于是便知道了python这门编程语言.我是光电信息科学与工程专业的学生,这个专业的学生必须要懂计算机 ...

  7. L1-019 谁先倒

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒.两人同赢或两人同输 ...

  8. 2019.1.22 zigbee test

    1传输测试 频谱仪设置: sigfox 模块串口设置: 自动选择对应型号 Test step: PS:发送TX指令 AT$cw=波特率,通道,uint 这里有个问题--不应该只发送一次 ------- ...

  9. path--diff

    vdom--patch(一)我们讲了,整个Vue对象初始化并渲染到页面中的过程. 本篇文章我们主要来谈谈当页面绑定的数据修改后,是如何更新dom结构的, 即vdom的diff算法,网上讲解这部分内容的 ...

  10. [追加评论]三款SDR平台对比:HackRF,bladeRF和USRP

    这三个月,有幸把3种板子都用到了.说说使用体会.   我用过其中的HackRF,bladeRF x115,USRP B210.我并没有仔细的测量各种板子的射频指标什么的,只是做各种实验的时候用到它们. ...