LOJ 6053 简单的函数——min_25筛
题目: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筛的更多相关文章
- LOJ.6053.简单的函数(Min_25筛)
题目链接 Min_25筛见这里: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushuyu/p/91 ...
- loj 6053 简单的函数 —— min_25筛
题目:https://loj.ac/problem/6053 参考博客:http://www.cnblogs.com/zhoushuyu/p/9187319.html 算 id 也可以不存下来,因为 ...
- loj#6053. 简单的函数(Min_25筛)
传送门 题解 \(Min\_25\)筛有毒啊--肝了一个下午才看懂是个什么东西-- \(zsy\)巨巨强无敌-- //minamoto #include<bits/stdc++.h> #d ...
- 简单的函数——Min_25筛
%%yyb %%zsy 就是实现一下Min-25筛 筛积性函数的操作 首先要得到 $G(M,j)=\sum_{t=j}^{cnt} \sum_{e=1}^{p_t^{e+1}<=M} [\phi ...
- LOJ #6053. 简单的函数
$Min$_$25$筛模版题 为什么泥萌常数都那么小啊$ QAQ$ 传送门:Here 题意: $ f(1)=1$$ f(p^c)=p⊕c(p 为质数,⊕ 表示异或)$$ f(ab)=f(a)f(b)( ...
- LOJ.6235.区间素数个数(Min_25筛)
题目链接 \(Description\) 给定\(n\),求\(1\sim n\)中的素数个数. \(2\leq n\leq10^{11}\). \(Solution\) Min_25筛.只需要求出\ ...
- LOJ #6202. 叶氏筛法(min_25 筛)
题意 求 \([L, R]\) 之间的素数之和 . \(L≤10^{10},2×10^{10} \le R \le 10^{11}\) 题解 一个有点裸的 min_25筛 ? 现在我只会筛素数的前缀和 ...
- min_25筛
min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...
- 「算法笔记」Min_25 筛
戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #inc ...
随机推荐
- 常见MIME类型例表
常见MIME类型例表: 序号 内容类型 文件扩展名 描述 1 application/msword doc Microsoft Word 2 application/octet-stream bin ...
- idea中使用gradle
idea中使用gradle gradle下载 gradle下载地址:https://services.gradle.org/distributions/ 这里假设下载的是4.6版本的,如下: 笔者下载 ...
- python中的对象
一.python对象 python使用对象模型来存储数据.构造任何类型的值都是一个对象. 所有python对象都拥有三个特性:身份.类型.值 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份可 ...
- Instantclient安装
Instantclient安装 成功
- bat批处理文件运行时隐藏cmd窗口
想让bat运行时隐藏cmd窗口,最好的方法是使用vbs文件实现, 1.新建一个文本文档,改名为123.vbs,编辑内容: set ws=WScript.CreateObject("WScri ...
- Arrow function restore
Arrow function restore 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { r ...
- ZOJ 3829 Known Notation 贪心 难度:0
Known Notation Time Limit: 2 Seconds Memory Limit: 65536 KB Do you know reverse Polish notation ...
- weblogic控制台定制不同权限的用户
安装weblogic并创建域(domain)的时候,会默认创建一个用户,此用户为管理员,也就是权限最大的.只有这样一个用户,用起来很不安全,因为一个测试环境,好多人在用,经常会有人修改上面的数据源等关 ...
- POJ 2309 BST(树状数组Lowbit)
题意是给你一个满二叉树,给一个数字,求以这个数为根的树中最大值和最小值. 理解树状数组中的lowbit的用法. 说这个之前我先说个叫lowbit的东西,lowbit(k)就是把k的二进制的高位1全部清 ...
- DevExpress v17.2新版亮点—ASP.NET篇(三)
用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress ASP.NET v17.2 的GridView Control. ...