ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数
题意: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]]处,我说得不是很清楚,也不知道怎么表达那个意思,可以自行模拟体会一下。
ACM-ICPC 2018 南京赛区网络预赛Sum,线性筛处理积性函数的更多相关文章
- ACM-ICPC 2018 南京赛区网络预赛 Sum
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- ACM-ICPC 2018 南京赛区网络预赛 J.sum
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- 计蒜客 30999.Sum-筛无平方因数的数 (ACM-ICPC 2018 南京赛区网络预赛 J)
J. Sum 26.87% 1000ms 512000K A square-free integer is an integer which is indivisible by any squar ...
- 计蒜客 30996.Lpl and Energy-saving Lamps-线段树(区间满足条件最靠左的值) (ACM-ICPC 2018 南京赛区网络预赛 G)
G. Lpl and Energy-saving Lamps 42.07% 1000ms 65536K During tea-drinking, princess, amongst other t ...
- ACM-ICPC 2018 南京赛区网络预赛
轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of g ...
- ACM-ICPC 2018 南京赛区网络预赛(12/12)
ACM-ICPC 2018 南京赛区网络预赛 A. An Olympian Math Problem 计算\(\sum_{i=1}^{n-1}i\cdot i!(MOD\ n)\) \(\sum_{i ...
- ACM-ICPC 2018 南京赛区网络预赛 E题
ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...
- ACM-ICPC 2018 南京赛区网络预赛B
题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...
- 计蒜客 30990.An Olympian Math Problem-数学公式题 (ACM-ICPC 2018 南京赛区网络预赛 A)
A. An Olympian Math Problem 54.28% 1000ms 65536K Alice, a student of grade 66, is thinking about a ...
随机推荐
- 连续取数字DP使值最大HDU2697
题意: 有n个数,每个数都有价钱,连续的取可以获得len*len的利益,使利益最大. 思路: 三维DP,1.2.3维分别是第i个,剩余多少钱,从后往前连续的有几个. #define IOS ios_b ...
- 初识php语法
初到一家php公司,由于之前做的java,现在记录一些学习php中的语法细节. =>的用法 => 是数组成员访问符号.在php中数组默认键名是整数,也可以自己定义任意字符键名(最好是有实际 ...
- python学习-10 运算符1
1.加+,减-,乘*,除/ 例如: a = 1 b = 2 c = a + b print(c) 运算结果: 3 Process finished with exit code 0 a = 1 b = ...
- MongoDB数据库、集合、文档的操作
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- 创建web服务器
用node创建本地web服务 1,创建本地文件server.js var http = require('http'); var url=require('url'); var fs=require( ...
- hdu 6045 多校签到题目
http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...
- HTTP中GET,POST和PUT的区别
一.HTTP中定义了以下几种请求方法: 1.GET:2.POST:3.PUT:4.DELETE;5.HEAD:6.TRACE:7.OPTIONS: 二.各个方法介绍: 1.GET方法:对这个资源的查操 ...
- 10.自定义EL函数和自定义标签
需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库 如果sun公司的EL函数库没有或者无法满足,就需要自 ...
- c#复制文件夹和文件
/// <summary> /// 拷贝文件夹 /// </summary> /// <param name="srcdir"></par ...
- 【4】Kafka集群启动/关闭脚本
说明:本脚本基于SSH服务器免密登录,如集群未配置SSH,参照:<SSH安装配置> . 一.启动脚本:start-kafka-cluster.sh #!/bin/bash brokers= ...