SPOJ DIVCNT2
SPOJ DIVCNT2
题目大意:
求\(S2(n)=\sum_{i=1}^{n}\sigma_0{(i^2)}\) 。
题解
我们可以先考虑括号里只有一个\(i\)的情况,这样,我们把\(i\)分解质因数为$p_1{a_1}*p_2{a_2}...p_k^{a_k} $。
那么这就是一个经典的问题,答案为
\]
现在\(i\)变成了\(i^2\)那么无非就是每个质因子的指数乘以2,所以答案就是:
\]
这是一堆二项式乘起来的形式,每一个质因子可以选或不选,考虑每一种方案是往\(2a_j\)去还是往1那边去,我们可以枚举一个往\(2a_j\)去的质因子集合,那么这时候的方案数就是\(\prod_{j}2a_j\)。
如果我们把里面的那个2提出来的话,那么这就是一个枚举所有的\(>0\)的\(a_j\)也就是枚举约数的过程,考虑对于每个约数,因为刚才我们把2提出来了,它的前面还乘上了\(2^{集合大小}\),这里的集合大小就是这个数的质因子个数,所以我们最后的答案就是:
\]
如果我们把\(w(d)\)看做每个质因数选或者不选,那么这个就是\(d\)的无平方因子的约数个数,考虑\(\mu\)函数的平方,如果这个数有平方因子那么就为0,否则就为1,所以答案变成:
\]
然后我们把枚举\(x\)的部分提前,那么我们就需要考虑每个\(x\)的倍数i有多少个约数也是\(i\)的倍数,那么就是:
\]
到这里做法就可以出来了,它是一个\(f(i)*g(\lfloor n/i\rfloor)\)的形式,所以我们可以对其除法分块,然后我们还要知道\(\mu^2\)和\(\sigma_0\)的前缀和,求\(\sigma_0\)的部分比较简单,可以直接枚举约数。
\]
对于\(\mu^2\)的前缀和,我们可以考虑枚举每个平方因子进行容斥:
\]
这样每个有平方因子的数刚好被算了0次,无平方因子的数刚好被算了一次。
然后就是外层除法分块,内层也有一个除法分块和枚举平方因子求\(\mu^2\)和、\(\sigma_0\)的前缀和,我们可以通过一些预处理前缀和来降低后面枚举的复杂度。
代码
#include<iostream>
#include<cstdio>
#define N 5000009
using namespace std;
typedef long long ll;
const int maxn=5e6;
int miu[N],prime[N],sum[N],d[N],ci[N];
ll sumd[N];
bool vis[N];
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
inline void prework(){
int k;
miu[1]=1;d[1]=1;
for(int i=2;i<=maxn;++i){
if(!vis[i]){prime[++prime[0]]=i;miu[i]=-1;ci[i]=1;d[i]=2;}
for(int j=1;j<=prime[0]&&(k=i*prime[j])<=maxn;++j){
vis[k]=1;ci[k]=1;d[k]=2;
if(i%prime[j]==0){ci[k]+=ci[i];d[k]=d[i]*(ci[k]+1)/ci[k];break;}
miu[k]=-miu[i];d[k]=d[i]<<1;
}
}
for(int i=1;i<=maxn;++i)sum[i]=sum[i-1]+miu[i]*miu[i],sumd[i]=sumd[i-1]+d[i];
}
inline ll calc(ll n){
if(n<=maxn)return sumd[n];
ll r,ans=0;
for(ll l=1;l<=n;l=r+1){
r=n/(n/l);
ans+=(n/l)*(r-l+1);
}
return ans;
}
inline ll calcsum(ll n){
if(n<=maxn)return sum[n];
ll ans=0;
for(ll i=1;i*i<=n;++i){
ans+=(n/(i*i))*miu[i];
}
return ans;
}
inline ll get(ll n){
ll ans=0;ll r;
for(ll l=1;l<=n;l=r+1){
r=n/(n/l);
ans+=calc(n/l)*(calcsum(r)-calcsum(l-1));
}
return ans;
}
int main(){
int T=rd();
prework();
while(T--){
ll n=rd();
printf("%lld\n",get(n));
}
return 0;
}
SPOJ DIVCNT2的更多相关文章
- SPOJ DIVCNT2 [我也不知道是什么分类了反正是数论]
SPOJ DIVCNT2 - Counting Divisors (square) 题意:求 \[ \sum_{i=1}^n\sigma_0(i^2) \] 好棒啊! 带着平方没法做,考虑用其他函数表 ...
- 【胡策篇】题解 (UOJ 192 + CF938G + SPOJ DIVCNT2)
和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\( ...
- SPOJ : DIVCNT2 - Counting Divisors (square)
设 \[f(n)=\sum_{d|n}\mu^2(d)\] 则 \[\begin{eqnarray*}\sigma_0(n^2)&=&\sum_{d|n}f(d)\\ans&= ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- Min_25 筛小结
Min_25 筛这个东西,完全理解花了我很长的时间,所以写点东西来记录一些自己的理解. 它能做什么 对于某个数论函数 \(f\),如果满足以下几个条件,那么它就可以用 Min_25 筛来快速求出这个函 ...
- [51Nod 1222] - 最小公倍数计数 (..怎么说 枚举题?)
题面 求∑k=ab∑i=1k∑j=1i[lcm(i,j)==k]\large\sum_{k=a}^b\sum_{i=1}^k\sum_{j=1}^i[lcm(i,j)==k]k=a∑bi=1∑kj ...
- SPOJ 20713 DIVCNT2 - Counting Divisors (square)
DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ0 ...
- SPOJ divcntk(min25筛)
题意 \(\sigma_0(i)\) 表示 \(i\) 的约数个数 求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k)\pmod {2^{64}} \] 共 \(T\) 组数据 ...
- DIVCNT2&&3 - Counting Divisors
DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...
随机推荐
- SpringBoot2.0整合Redis
Spring Boot2.0在2018年3月份正式发布,相比1.0还是有比较多的改动,例如SpringBoot 自2.0起支持jdk1.8及以上的版本.第三方类库升级.响应式 Spring 编程支持等 ...
- Django学习之七:Django 中间件
目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...
- 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
1.前言 框框博客在线报时:2018-11-07 19:31:06 当前MySQL最新版本:8.0.13 (听说比5.7快2倍) 官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MyS ...
- RAID5当一块硬盘离线后处理
RAID5当一块硬盘离线后,处理降级状态,这时候正常的建议是马上更换硬盘做REBUILD以恢复完整的数据状态,如果有热备盘的话,就会自动做REBUILD,这样做合适吗? 一组RAID卷在工作很长时间以 ...
- CSS3中三角形及三角形组合图实现
几何之三角形及三角形的组合图案理论 三角形( triangle ['traɪæŋɡl])可以看成正方形对角线交叉形成的图形 若想得到编号①方向向下三角形,只需对编号②③④三角形让其透明tran ...
- 【spring源码分析】IOC容器初始化(四)
前言:在[spring源码分析]IOC容器初始化(三)中已经分析了BeanDefinition注册之前的一些准备工作,下面将进入BeanDefinition注册的核心流程. //DefaultBean ...
- dicom错误解决
https://github.com/pydicom/pydicom/issues/331 sudo apt-get install python-gdcm
- handsontable的基础应用
handsontable是一款页面端的表格式交互插件,可以通过她加载显示表格内容,能够支持合并项.统计.行列拖动等. 同时,支持对加载后的表格页面的处理:添加/删除行/列,合并单元格等操作. 我在项目 ...
- [原创]一款小巧、灵活的Java多线程爬虫框架(AiPa)
1.简介 AiPa 是一款小巧,灵活,扩展性高的多线程爬虫框架. AiPa 依赖当下最简单的HTML解析器Jsoup. AiPa 只需要使用者提供网址集合,即可在多线程下自动爬取,并对一些异常进行处理 ...
- python基础 常见用法
1.python计时器timeit模块 1)timeit 模块定义了接收两个参数的Timer类,两个参数都是字符串. 参数1:要计时的语句或者函数 参数2:为参数1构建环境的导入语句 2)Timer对 ...