[Spoj]Counting Divisors (cube)
来自FallDream的博客,未经允许,请勿转载,谢谢。
设d(x)表示x的约数个数,求$\sum_{i=1}^{n}d(i^{3})$
There are 5 Input files.
- Input #1: 1≤N≤10000, TL = 1s.
- Input #2: 1≤T≤300, 1≤N≤10^8, TL = 20s.
- Input #3: 1≤T≤75, 1≤N≤10^9, TL = 20s.
- Input #4: 1≤T≤15, 1≤N≤10^10, TL = 20s.
- Input #5: 1≤T≤2, 1≤N≤10^11, TL = 20s.
$i^{3}$的约数个数$d(i^{3})$是一个积性函数,所以转而求$d(x)=\prod{F(pi^{ci})}$,其中$F ( pk ^ {ck} )=3ck+1$
可以直接洲阁筛 学了一天大概懂了 顺便抄了个模板
-----
gi表示1-i中与前j个质数互质的数字的F之和
fi表示1-i中由小于根号n的后j个质数组成的数字的F之和
容易得出转移方程 $$g[i][j]=g[i][j]-F(pk)g[\frac{i}{pk}][j-1]$$
$$ f[i][j]=f[i][j-1]+\sum_{ck>=1}F(pk^{ck})f[\frac{i}{pk^{ck}}][j]$$
显然i只有根号种取值 对于每个根号n以内的质数都要转移,复杂度$O(\frac{n}{\log n})$
考虑优化,显然$p_{j+1}>i$的时候,g[i][j]=4(3*1+1)
所以当$pj^{2}>i$的时候,g[i][j]=g[i][j-1]+F(pi) 可以不用转移,用的时候补上那一段即可。
之所以把f的状态表示成"后j个",也是出于这个目的
这样的复杂度近似是$O(\frac{n^{\frac{3}{4}}}{logn})$
然后线筛出根号n以内的F[],答案是$f[n]+\sum_{i=1}^{\sqrt{n}}F[i]g[\frac{n}{i}]$
#include<iostream>
#include<cstdio>
#include<cmath>
#define MN 320000
#define ll long long
using namespace std;
inline ll read()
{
ll x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
} int s[MN+],num=,last[MN+],l[MN+],l0[MN+],sq,P,N[MN+];
ll f0[MN+],f[MN+],g0[MN+],g[MN+],d[MN+],n;
bool b[MN+]; void CalcF()
{
for(int i=;i<=sq;++i) f[i]=f0[i]=;
for(int i=P-;i;--i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=(n/j)/s[i];
for(int tms=;now;now/=s[i],tms+=)
{
if(now<=sq) f[j]+=tms*(f0[now]+*(max(,N[now]-max(i+,l0[now])+)));
else f[j]+=tms*(f[n/now]+*max(,P-max(i+,l[n/now])));
}
}
for(int j=sq;j&&l0[j]>i;--j)
{
ll now=j/s[i];
for(int tms=;now;tms+=,now/=s[i])
f0[j]+=tms*(f0[now]+*max(,N[now]-max(i+,l0[now])+));
}
}
for(int i=;i<=sq;++i) f[i]+=*(P-l[i]);
} void CalcG()
{
for(int i=;i<=sq;++i)
g0[i]=i,g[i]=n/i;
for(int i=;i<P;++i)
{
for(int j=;j<=sq&&l[j]>i;++j)
{
ll now=n/j/s[i];
if(now<=sq) g[j]-=g0[now]-max(,i-l0[now]);
else g[j]-=g[n/now]-max(,i-l[n/now]);
}
for(int j=sq;j&&l0[j]>i;--j)
g0[j]-=g0[j/s[i]]-max(,i-l0[j/s[i]]);
}
for(int i=;i<=sq;++i) g[i]-=P-l[i];
} int main()
{
d[]=;
for(int i=;i<=MN;++i)
{
if(!b[i]) s[++num]=last[i]=i;
for(int j=;s[j]*i<=MN;++j)
{
b[s[j]*i]=,last[s[j]*i]=s[j];
if(i%s[j]==) break;
}
int sum=,tms,p;
for(int j=i;j>;)
{
tms=;p=last[j];
for(;j%p==;j/=p,++tms);
sum*=(tms*+);
}
d[i]=sum;
N[i]=N[i-]+(!b[i]);
}
for(int T=read();T;--T)
{
n=read();sq=sqrt(n);l[sq+]=;
for(P=;1LL*s[P]*s[P]<=n;++P);
for(int i=;i<=sq;++i)
for(l0[i]=l0[i-];1LL*s[l0[i]]*s[l0[i]]<=i;++l0[i]);
for(int i=sq;i;--i)
for(l[i]=l[i+];1LL*s[l[i]]*s[l[i]]<=n/i;++l[i]);
CalcF();CalcG();
ll ans=f[];
for(int i=;i<=sq;++i)
ans+=*d[i]*(g[i]-);
printf("%lld\n",ans);
}
return ;
}
[Spoj]Counting Divisors (cube)的更多相关文章
- [SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛
分析 首先,STO ywy OTZ,ywy TQL%%%! 说一下这道题用min_25筛怎么做. 容易发现,对于所有质数\(p\),都满足\(f(p)=4\),于是我们就可以直接通过\([1,x]\) ...
- DIVCNT2&&3 - Counting Divisors
DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...
- SPOJ 20713 DIVCNT2 - Counting Divisors (square)
DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ0 ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors(求因子的个数)
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- hdu 6069 Counting Divisors 筛法
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...
- hdu6069 Counting Divisors 晒区间素数
/** 题目:hdu6069 Counting Divisors 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意:求[l,r]内所有数的k次方 ...
随机推荐
- 项目Beta冲刺Day7
项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...
- 申请JetBrains学生免费注册码
1.申请.edu.*后缀的邮箱 从某个知乎用户上面得到了两个可以申请的后缀edu的邮箱 上海交通大学校友统一身份认证:https://register.alumni.sjtu.edu.cn/alumn ...
- 基于ssm的poi反射bean实例
一:该例子是笔者在实际项目应用过程中,针对项目完成的一套基于poi的导入导出例子,其中一些与项目有关的代码大家直接替换成自己的需求即可. 二:笔者在项目中使用的是poi的XSSF,对应maven的po ...
- 帧动画的创建方式 - 纯Java代码方式
废话不多说,先看东西 帧动画的创建方式主要以下2种: * 用xml创建动画: * 纯Java代码创建动画: 本文内容主要关注 纯java代码创建帧动画 的方式: 用xml创建帧动画:http:// ...
- hadoop大数据技术架构详解
大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...
- AutoCAD中的扩展字典及扩展记录(C#)
在学习CAD扩展记录的过程中,遇到了一些问题,也积累了一些经验,现在给大家分享一些我的学习心得.在学习扩展字典之前需要读者了解cad的组码,也就是DxfCode.感兴趣的也可以了解一下扩展数据的相关内 ...
- HTTP协议扫盲(二)HTTP协议的请求方法、请求头和响应头
一.HTTP请求方法 Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST ...
- Mysql官方文档翻译系列14.18--MySql备份与恢复
原文链接: (https://dev.mysql.com/doc/refman/5.7/en/innodb-backup-recovery.html) The key to safe database ...
- python基础——内置函数
python基础--内置函数 一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highl ...
- python打包压缩文件夹zip+组装文件夹
无意间想到的一个需求,然后就顺手写了写,留下来,方便以后用 列表版:(基本没用,仅提供思路,字典版稍微改动可以直接用) 大体需求: 把重复的文件名进行改名,达到浏览器下载相同文件的效果 下载完成后再把 ...