利用powerful number求积性函数前缀和
好久没更博客了,先水一篇再说。其实这个做法应该算是杜教筛的一个拓展。
powerful number的定义是每个质因子次数都 $\geq 2$ 的数。首先,$\leq n$ 的powerful number个数是 $O(\sqrt{n})$ 的,这是因为所有powerful number显然可以表示成 $a^2b^3$,所以个数不超过 $\sum_{i=1}^{\sqrt{n}} (n/i^2)^{1/3}$,积分积一下就算出来了。求所有 $\leq n$ 的powerful number只要暴搜质因子分解式即可。
例题1 pe63?
有一个积性函数 $F$ 满足对于所有质数 $p$,$F(p^q)=p~(q \geq 1)$,求 $F$ 的前缀和。
我们发现有一个跟它长得很像的积性函数 $G$!$G(x)=x$,我们会求 $G$ 的前缀和!并且对于所有质数 $p$,$G(p)=F(p)=p$。
我们求出 $H=F/G$,其中除法指的是狄利克雷除法,即狄利克雷卷积的逆运算。$H$ 也是一个积性函数,那么由 $F(p^q)=\sum_{i=0}^q G(p^i)H(p^{q-i})$ 和 $H(1)=1$ 不难发现对于所有质数 $p$,$H(p)=0$。
我们欲求的是 $\sum_{i=1}^n F(i)$,由于 $F=H*G$(乘法为狄利克雷卷积),那么有 $\sum_{i=1}^n F(i)=\sum_{ij \leq n} H(i)G(j)=\sum_{i=1}^n H(i) \sum_{j=1}^{n/i} G(j)$。
由于 $H(p)=0$,所有 $H(i) \neq 0$ 的位置显然都是powerful number,我们只需枚举所有powerful number,算出对应的 $H$ 即可。
例题2 pe48?
求满足对质数 $p$,$F(p^d)=p^{d-[d \bmod p]}$ 的积性函数 $F$ 的前缀和。
$F(p)=1$。同上构造 $G(x)=1$ 即可。
例题3 loj6053
求满足对质数 $p$,$F(p^c)=p \oplus c$ 的积性函数 $F$ 的前缀和。
对 $p \neq 2$,$F(p)=p-1$。构造 $G=\varphi$ 即可,注意要特殊处理一下 $p=2$ 的情形。求欧拉函数的前缀和可以杜教筛,这里不再赘述。跑过min25筛是不可能的,这辈子都不可能跑过的
这里给出loj6053的代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
#define SZ 10000099
bool np[SZ];
int ph[SZ],ps[SZ/10],pn;
void shai()
{
ph[1]=1;
for(int i=2;i<SZ;++i)
{
if(!np[i]) ps[++pn]=i,ph[i]=i-1;
for(int j=1;j<=pn&&i*ps[j]<SZ;++j)
{
np[i*ps[j]]=1;
if(i%ps[j]==0)
{
ph[i*ps[j]]=ph[i]*ps[j];
break;
}
ph[i*ps[j]]=ph[i]*(ps[j]-1);
}
}
for(int i=1;i<SZ;++i)
ph[i]=(ph[i-1]+ph[i])%MOD;
}
ll n,u,s[1005];
ll S2(ll a)
{
ll b=a+1;
if(a&1) b>>=1; else a>>=1;
return (a%MOD)*(b%MOD)%MOD;
}
int h[100099][66],d[100099];
ll ans=0;
void dfs(ll x,ll v,int w)
{
ans=(ans+v*((n/x<SZ)?ph[n/x]:s[n/(n/x)]))%MOD;
if(w>1&&x>n/ps[w]/ps[w]) return;
for(int s=w;s<=pn;++s)
{
if(s>1&&x*ps[s]*ps[s]>n) break;
ll y=x*ps[s];
for(int j=1;y<=n;++j,y*=ps[s])
{
if(d[s]<j)
{
++d[s];
ll F=ps[s]^j,G=ps[s]-1;
for(int k=1;k<=j;++k)
F=(F-G%MOD*h[s][j-k])%MOD,G*=ps[s];
h[s][j]=F;
}
if(!h[s][j]) continue;
dfs(y,v*h[s][j]%MOD,s+1);
}
}
}
int main()
{
for(int i=0;i<=100000;++i)
h[i][0]=1;
shai(); cin>>n;
u=1; while(n/u>=SZ) ++u;
for(int i=u;i>=1;--i)
{
//s[i]=phi(n/i)
ll t=n/i,a=2,b,p; s[i]=S2(t);
for(;a<=t;a=b+1)
p=t/a,b=t/p,
s[i]=(s[i]-(b-a+1)%MOD*((p<SZ)?ph[p]:s[b*i]))%MOD;
}
dfs(1,1,1);
ans=(ans%MOD+MOD)%MOD;
cout<<ans<<"\n";
}
利用powerful number求积性函数前缀和的更多相关文章
- powerful number求积性函数前缀和
算法原理 本文参考了 zzq's blog . \(\text{powerful number}\) 的定义是每个质因子次数都 \(\ge 2\) 的数,有个结论是 \(\ge n\) 的 \(\te ...
- 【Learning】积性函数前缀和——洲阁筛(min_25写法)
问题描述 洲阁筛解决的问题主要是\(n\)范围较大的积性函数前缀和. 已知一积性函数\(f(i)\),求\(\sum_{i=1}^nf(i)\). \(n\leq10^{12}\). 求解方法 如 ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- A New Function(LightOJ 1098)积性函数前缀和的应用
题意:要求对于1~n,每个数的约数(不包括1和其本身)的和. 题解:由于题目数据有2*10^9之大,因而不能直接暴力.需要考虑积性函数的特性,由于必定有重复的约数出现,因而可以对重复约数所在的区间进行 ...
- Powerful Number 学习笔记
定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...
- [笔记] Powerful Number 筛
定义 Powerful Number(以下简称 PN)筛类似于杜教筛,可以拿来求一些积性函数的前缀和. 要求: 假设现在要求积性函数 \(f\) 的前缀和 \(F(n)=\sum_{i=1}^nf(i ...
- Powerful Number 筛学习笔记
Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...
- Note - Powerful Number
Powerful Number 对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 ...
- Powerful Number 筛法
我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...
随机推荐
- 2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础
基础问题回答 (1)什么是表单 我认为,form概念主要区分于table,table是用网页布局设计,是静态的,form是用于显示和收集信息传递到服务器和后台数据库中,是动态的: 以下是表单的百度百科 ...
- 20155237 第十一周java课堂程序
20155237 第十一周java课堂程序 内容一:后缀表达式 abcde/-f+ 内容二:实现Linux下dc的功能,计算后缀表达式的值 填充下列代码: import java.util.Scann ...
- WPF 初学VisifireChart
visifire今天登陆他们官网的时候,发现好像是挂掉了,不知道是不再运营了,还是单纯服务器出了问题. VisifireChart的效果不炫,但是对于一些项目,感觉够用的,所以,今天大概看了几篇博客, ...
- python绘制三维图
作者:桂. 时间:2017-04-27 23:24:55 链接:http://www.cnblogs.com/xingshansi/p/6777945.html 本文仅仅梳理最基本的绘图方法. 一. ...
- 蓝牙inquiry流程之命令下发
Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controlle ...
- 微信小程序之 动画 —— 自定义底部弹出层
wxml: <view class='buy' bindtap='showBuyModal'>立即购买</view> <!-- 点击立即购买 弹出购买遮罩层 --> ...
- C# Language Specification 5.0 (翻译)第五章 变量
变量(variable)表示存储的位置.每个变量都有类型,类型决定变量保存的值的类型.C# 是一门类型安全的语言,C# 编译器会确保变量中保存一个适合类型的值.变量的值可通过赋值或通过使用 ++ 与 ...
- EF查询百万级数据的性能测试--单表查询
一.起因 个人还是比较喜欢EF的,毕竟不用写Sql,开发效率高,操作简单,不过总是听人说EF的性能不是很好,也看过别人做的测试,但是看了就以为真的是那样.但是实际上到底是怎么样,说实话我真的不知道. ...
- REST-framework快速构建API--权限
我们在访问资源时,有些资源保密程度较高,需要特殊的人员才能访问.比如,获取公司的每日收入流水的API接口,只能CEO才能查看. 这时,我们就需要将资源设定权限了. REST-framework实现如下 ...
- 谷歌算法研究员:我为什么钟爱PyTorch?
老铁们好!我是一名前谷歌的算法研究员,处理深度学习相关项目已有三年经验,接下来会在平台上给大家分享一些深度学习,计算机视觉和统计机器学习的心得体会,当然了内推简历一定是收的.这篇文章,不想说太多学术的 ...