ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数
2024-09-05 07:59:18
题意:f(n)是n可以拆成多少组n=a*b,a和b都是不包含平方因子的方案数目,对于a!=b,n=a*b和n=b*a算两种方案,求∑i=1nf(i)
首先我们可以知道,n=1时f(1)=1,
然后我们继续分析,当n为素数p时,只能拆成n=1*p和n=p*1这两种,所以f(p)=2,
而当n=两个质数的乘积时,对于n=左*右,p1跟p2可以任意分配在左和右,它们的方案是类乘的,所以f(p1*p2)=f(p1)*f(p2)
这里可以看出f(n)是个积性函数,那说明我们可以把它通过线性筛筛出来。
那我们就要考虑n=pk的时候,当k>2时,对于n=左*右,不管哪个方案,左或者右那边必定有一边是存在因子包含p2的,所以此时f(pk)=0,k>2
k=1时便是n=p,而k==2时呢,p只能分别在左右两边各一个,f(p2)=1
最后推广n=p1k1*p2k2的时候,k1,k2肯定都不能>2,然后就是(0,0),(0,1),(0,2),(1,0),(1,1,)(1,2),(2,0)(2,1)(2,2)这九种,推导一下就是f(p1k1*p2k2)=f(p1k1)*f(p2k2)
具体编程实现上的话,因为欧拉筛对于每个数来说,是通过它的最小质因子来筛掉它,那么我们可以记录每个数的最小质因子的指数exp,详情见注释
#include<cstdio>
typedef long long ll;
const int N=;
bool nop[N]={false};
int pn,pri[N/],exp[N],f[N];
void init()
{
f[]=;
for(int i=;i<N;i++)
{
if(!nop[i])
{
f[i]=;
exp[i]=;
pri[pn++]=i;
}
for(int j=;j<pn&&1ll*i*pri[j]<N;j++)
{
int pp=i*pri[j];
nop[pp]=true;
//欧拉筛中,pri[j]是pp的最小质因子
if(i%pri[j]==)
{
//i的质因子有pri[j],pp的最小质因子的指数就是exp[i]+1
exp[pp]=exp[i]+;
if(exp[pp]>)
f[pp]=;
else
f[pp]=f[i/pri[j]];
//在i的方案上,再加入一个pri[j],不能跟i中原来有的
//pri[j]在同一边,而在对立边时,i中原来有的pri[j]
//在左,在右都一样,对方案没有了影响,所以
//f[i*pri[j]]=f[i/pri[j]];
break;
}
//i的质因子没有pri[j],那么pp中只有一个pri[j]
exp[pp]=;
f[pp]=f[i]*f[pri[j]];
}
}
for(int i=;i<N;i++)
f[i]+=f[i-];
}
int main()
{
init();
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",f[n]);
}
return ;
}
线性啊欧拉啊
对于f[pp]=f[i/pri[j]]处,我说得不是很清楚,也不知道怎么表达那个意思,可以自行模拟体会一下。
最新文章
- 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ItemSelector)
- c语言->;和 .
- Javascript链式调用案例
- [GRYZ2015]工业时代
- Java DES 测试
- CSS样式中ClearBoth的理解
- 09-UIKit(UICollectionViewController、UITabBarController)
- socket为send和recv设置超时时间
- HDU 4815 背包
- 在C#中使用类golang信道编程(一)
- JavaScript 中 闭包 的详解
- SSM-Spring-18:Spring中aspectJ的XML版
- .NET Core 中的通用主机和后台服务
- linux一台服务器配置多个Tomcat
- MongoDB学习总结(二)
- Html的本质及在web中的作用
- BitNami
- [hadoop]hadoop api 新版本与旧版本的差别
- Clojure 的 Enlive 库尝试
- CSS3动画库——animate.css
热门文章
- Closest Common Ancestors (Lca,tarjan)
- C标准库常用函数概要
- fiddler笔记:快捷工具栏
- gulp做简单的js压缩
- JArray
- 怎样在页面关闭时发起HTTP请求
- Sql语句知识大全
- Django多对多
- vue使用sass报Modele build failed: TypeError: this.getResolve is not a function at Object.loader...
- CentOS7中使用yum安装Nginx的详细步骤