题目: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. web移动端生产环境调试

    如果是开发环境,比较容易: 最笨的方法是手机开QQ电脑开QQ把做好的页面传给手机QQ直接打开.. 参考: http://blog.allenm.me/2014/05/mobile-web-debug- ...

  2. httpclient 连接管理器

    连接操作器 连接操作是客户端的底层套接字或可以通过外部实体,通常称为连接操作的被操作的状态的连接. OperatedClientConnection接口扩展了HttpClientConnection接 ...

  3. 封装ajax函数

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  4. 数据库schema的简介

    [参考]自百度百科 数据库中的Schema,为数据库对象的集合,一个用户一般对应一个schema. 官方定义如下: A schema is a collection of database objec ...

  5. Oracle 数据库分析

    一.数据库分析 二.表的分析 1.分析表exec dbms_stats.gather_table_stats('SFISM4','R_SN_DETAIL_T',CASCADE=>TRUE);ex ...

  6. MyEclipse 2017 CI 9 发布(附下载)

    挑战全年最低价!MyEclipse线上狂欢继续!火热开启中>> 在进入年底之时,2017 CI 9是我们最大的版本发布之一.在新版本中,我们添加了对Angular 5和TypeScript ...

  7. http请求报头

    客户请求的处理:Http请求报头 创建高效servlet的关键之一,就是要了解如何操纵超文本传输协议(HypeText TransferProtocol, HTTP). HTTP请求报头不同于前一章的 ...

  8. struts2.properties

    #action后缀struts.action.extension=action#上传文件的工作目录与文件的最大尺寸struts.multipart.saveDir=struts.multipart.m ...

  9. vee-validate 中文配置报错及自定义规则 报错.updateDictionary/.addlocale is not a function

    原因由于vee-validate版本更新的问题导致的. 1. 原因分析: a 新版vee-validate的语言配置方法变化了, Validator.localize('zh_CN', zh_CN) ...

  10. 福大软工1816 · 第八次作业(课堂实战)- 项目UML设计(团队)

    团队 学号 姓名 本次作业博客链接 031602428 苏路明(组长) https://www.cnblogs.com/Sulumer/p/9822854.html 031602401 陈瀚霖 htt ...