题目: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. oo第四篇博客作业

    测试与正确性论证的效果差异及各自的优缺点: 测试针对一些典型的输入情况进行方法验证,可操作性更强,结果直观.但不能完全覆盖所有的输入情况. 正确性论证则是根据代码逻辑从所有的方面对方法进行论证,可操作 ...

  2. SpringMVC RESTful风格URL处理带点的参数

    使用了RESTful风格的URL.但是在处理带点的搜索参数,比如baidu.com的时候,后台就取不到正确的参数了. 搜索了下原因,原来是SpringMVC将点号看作扩展分隔符号了,因此后台没法拿到正 ...

  3. [LeetCode] 268. Missing Number ☆(丢失的数字)

    转载:http://www.cnblogs.com/grandyang/p/4756677.html Given an array containing n distinct numbers take ...

  4. 解密微信sqlite数据库

    最近在研究解密微信APP的数据库, 1.通过Android手机内置备份功能,可以获取到微信的数据库文件,再通过adb传到电脑上. 2.获取微信EnMicroMsg.db库的密码(通过IMEI和uin值 ...

  5. 072——VUE中vuex之使用mutations修改购物车仓库数据

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Yii1.1测试环境配置(一)

    一.安装wampserver wampserver集成了PHP.Apacha.MySql,可以省去分别安装的麻烦.wampserver的安装配置方法可以自行搜索. wampserver安装完成后需要手 ...

  7. 《Python》 property、classmethod、staticmethod、isinstance、issubclass

    一.property property是一个装饰器函数 装饰器函数的使用方法:在函数.方法.类的上面一行直接@装饰器的名字 装饰器的分类: 1.装饰函数 2.装饰方法:property 3.装饰类 i ...

  8. ansible with_subelements

    with_subelements 循环列表中的子元素 (意想不到的地方会用到) --- - hosts: web tasks: - authorized_key: "user={{ item ...

  9. ORACLE telnet 1521 不通及ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务的解决

    服务器上安装了oracle11g , 防火墙上已经增加1521 入站规则.但是内网客户端配置好了TNS无法连接.telnet 1521 不通. 需要在服务器上\product\10.2.0\db_1\ ...

  10. 将本地的一个新项目上传到GitHub上新建的仓库中去

    转载: 如何将本地的一个新项目上传到GitHub上新建的仓库中去 踩过的坑: 1.在git push时报错 error: RPC failed; curl 56 SSL read: error:000 ...