好久没更博客了,先水一篇再说。其实这个做法应该算是杜教筛的一个拓展。

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求积性函数前缀和的更多相关文章

  1. powerful number求积性函数前缀和

    算法原理 本文参考了 zzq's blog . \(\text{powerful number}\) 的定义是每个质因子次数都 \(\ge 2\) 的数,有个结论是 \(\ge n\) 的 \(\te ...

  2. 【Learning】积性函数前缀和——洲阁筛(min_25写法)

    问题描述 洲阁筛解决的问题主要是\(n\)范围较大的积性函数前缀和. ​ 已知一积性函数\(f(i)\),求\(\sum_{i=1}^nf(i)\). \(n\leq10^{12}\). 求解方法 如 ...

  3. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  4. A New Function(LightOJ 1098)积性函数前缀和的应用

    题意:要求对于1~n,每个数的约数(不包括1和其本身)的和. 题解:由于题目数据有2*10^9之大,因而不能直接暴力.需要考虑积性函数的特性,由于必定有重复的约数出现,因而可以对重复约数所在的区间进行 ...

  5. Powerful Number 学习笔记

    定义 对于一个正整数 \(n\) ,若完全分解之后不存在指数 \(=1\) ,则称 \(n\) 为 \(\text{Powerful Number}\) . 可以发现的是,在 \([1,n]\) 中, ...

  6. [笔记] Powerful Number 筛

    定义 Powerful Number(以下简称 PN)筛类似于杜教筛,可以拿来求一些积性函数的前缀和. 要求: 假设现在要求积性函数 \(f\) 的前缀和 \(F(n)=\sum_{i=1}^nf(i ...

  7. Powerful Number 筛学习笔记

    Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...

  8. Note - Powerful Number

    Powerful Number   对于 \(n\in\mathbb N_+\),若不存在素数 \(p\) 使得 \(p\mid n~\land~p^2\not\mid n\),则称 \(n\) 为 ...

  9. Powerful Number 筛法

    我也不想学筛法了,可你考试时候出一个新筛法就不厚道了吧,我还开始以为这是杜教筛... $tips:$学完杜教筛立马学$Powerful \ Number$筛法,此筛法强悍如斯 $Powerful \ ...

随机推荐

  1. odoo明细表汇总数据

    一.在主表中#改动地方 总结算金额 求和:def _get_subtotal2(self, cr, uid, ids, field_name, arg, context=None): # 初始化 re ...

  2. 在win10下使用docker快速搭建ruby开发环境

    docker在windows下发力的时候必将取代各种虚拟机,并改变程序员的开发习惯,或许还会改变infra的工作. 概要: 在Windows下搭建开发环境一直是infra(我)头疼的事情.为了解决这个 ...

  3. 大数据入门第二十天——scala入门(一)入门与配置

    一.概述 1.什么是scala  Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...

  4. 20155334 《网络攻防》 Exp9 Web安全基础

    <网络攻防> Exp9 Web安全基础 一.实验后回答问题 SQL注入攻击原理,如何防御: 原理: 就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服 ...

  5. mfc CListBox

    通过ID操作对象 CListBox(列表框)控件 CListBox类常用成员 CListBox插入数据 CListBox删除数据 CListBox运用示例 一.CListBox类常用成员 CListB ...

  6. R语言学习 第二篇:矩阵和数组

    向量是一维的,只有行这一个维度,没有其他维度.R可以创建更高维度的数据对象,例如,矩阵.数据框.数组,索引高维度的对象时,需要使用元素的下标.这些对象的下标都使用中括号[]和索引,第一个维度是row, ...

  7. 《Effective Java》学习笔记 ——异常

    充分发挥异常的优点,可以提高程序的可读性.可靠性和可维护性. 第57条 只针对异常的情况才使用异常 第58条 对可恢复的情况使用受检异常,对编程错误使用运行时异常 * 如果期望调用者能够适当的恢复,使 ...

  8. JQ_下雪特效

    这是一个jQuery下雪特效.特效的代码如下: <style>body{background:black;color:white}</style><script>/ ...

  9. H5游戏接微信小游戏的支付,满满的都是坑!

    h5小游戏接微信的支付,简直是在为难我胖虎,说多了都是泪. 准备工作: 准备工作一定要做好,不然很容易出错.首先是session_key这个字段,这个session_key是登录的时候需要用到的,根据 ...

  10. 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard

    目录 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard 正文 对我的启发 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard Sanyam Bhutani 是 M ...