SPOJ:[DIVCNT3]Counting Divisors



题目大意:求1~N的每个数因子数的立方和。
题解:由于N过大,我们不能直接通过线性筛求解。我们可以采用洲阁筛。
洲阁筛的式子可以写成:

对于F(1~√n),可以直接线性筛求解。
对于
,我们进行以下DP:
g[i][j]为1~j中,与前i个质数互质的数的F值之和。
dp过程中,有
如果p[i]>j,则g[i][j]=F(1);
如果p[i]*p[i]>j>=p[i],则g[i][j]=g[i-1][j]-p[i]^k*F(1)=g[d][j]-(p[d+1]^k~p[i]^k)*F(1),其中p[d]为最大的p[d]*p[d]<=j的质数;
如果j>=p[i]*p[i],我们老老实实调用式子。
对于
,我们用类似的方式DP:
f[i][j]为1~j中,只以第i个到第m个质数为质因子的数的F值之和(m为√N以内质数个数)。
类似的,dp过程中,有
如果p[i]>j,则f[i][j]=F(1);
如果p[i]*p[i]>j>=p[i],则f[i][j]=f[i+1][j]+F(p[i])*F(1)=F(1)+F(p[i]~p[e])*F(1),其中p[e]为最大的p[e]<=j的质数;
如果j>=p[i]*p[i],我们老老实实调用式子。
代码:
#include<bits/stdc++.h>
using namespace std;
long long block,n,lb[],dp[],zs[],ans[],ans2;
bool bo[],bo2[];
int dp2[],dp3[],m,mm,tot,j,bo3[],tt;
void xxs(int n)
{
ans[]=;
for(int i=;i<=n;i++)
{
if(bo[i]==){ mm++; zs[mm]=i; ans[i]=; bo2[i]=; bo3[i]=; }
for(int j=;j<=mm;j++)
if(zs[j]*i>n)break;else
if(i%zs[j]==)
{
if(bo2[i]==)bo2[i*zs[j]]=; bo3[i*zs[j]]=bo3[i]+; ans[i*zs[j]]=ans[i]/bo3[i]*(bo3[i]+);
bo[i*zs[j]]=; break;
}else { ans[i*zs[j]]=ans[i]*; bo[i*zs[j]]=; bo3[i*zs[j]]=; }
}
}
int dy(long long x){ if(x<=block)return x;else return tot-n/x+; }
long long get(int i,int j)
{
if(dp2[j]==i)return dp[j];else
if(lb[j]<zs[i]){ if(j>)return ; return ; }
return dp[j]-i+dp2[j];
}
long long get2(int i,int j)
{
if(dp2[j]==i)return dp[j];else
if(lb[j]<zs[i])return ;
return (dp3[j]-i+)*+;
}
int main()
{
scanf("%d",&tt); xxs();
for(int ii=;ii<=tt;ii++)
{
scanf("%lld",&n); block=(int)sqrt(n); ans2=;
for(m=;m<=mm;m++)if(zs[m]>block)break; m--; tot=;
for(int i=;i<=block;i++){ lb[++tot]=i; if(1ll*i*i<n)lb[++tot]=n/i; }
sort(lb+,lb+tot+);
for(int i=;i<=tot;i++)dp[i]=lb[i],dp2[i]=;
for(int i=;i<=m;i++)
{
for(int j=tot;j>=;j--)
{
if(lb[j]<zs[i]*zs[i])break; dp2[j]=i;
dp[j]=dp[j]-get(i-,dy(lb[j]/zs[i]));
}
}
for(int i=;i<=block;i++)
ans2=ans2+ans[i]*(get(m,tot-i+)-)*;
j=;
for(int i=;i<=tot;i++)
{
dp[i]=; dp2[i]=m+;
while((j<=m)and(zs[j]<=lb[i]))j++; dp3[i]=j-;
}
for(int i=m;i>=;i--)
{
for(int j=tot;j>=;j--)
{
if(lb[j]<zs[i]*zs[i])break; dp[j]=get2(i+,j); dp2[j]=i;
long long t=j,l=;
while(lb[t]>=zs[i])
{
t=dy(lb[t]/zs[i]); l+=;
dp[j]=dp[j]+l*get2(i+,t);
}
}
}
ans2=ans2+get2(,tot);
printf("%lld\n",ans2);
}
}
SPOJ:[DIVCNT3]Counting Divisors的更多相关文章
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- 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&= ...
- [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 ...
- HDU 6069 Counting Divisors
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3
Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...
- 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 ...
随机推荐
- eclipse配置spring4.0环境详细教程
最近几天学习spring框架,在环境搭建过程中遇到了不少问题,网上找了不少资料都不是特别好,所以自己重新记录一下. 准备: 1.Eclipse下载,进官网,这里直接给链接了https://www.ec ...
- mysql rpm包安装
MySql5.7 安装文档 1.yum repo 安装 ``` wget http://dev.mysql.com/get/mysql57-community-release-el6-11.noarc ...
- macOS免费的NTFS读写软件
Mounty for Mac brew cask install mounty
- Vue学习笔记【22】——Vue中的动画(列表的排序过渡)
<transition-group> 组件还有一个特殊之处.不仅可以进入和离开动画,还可以改变定位.要使用这个新功能只需了解新增的 v-move 特性,它会在元素的改变定位的过程中应用. ...
- kubernetes(k8s)Pod污点与容忍
污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...
- (转)短信vs.推送通知vs.电子邮件:app什么时候该用哪种方式来通知用户?
转:http://www.360doc.com/content/15/0811/00/19476362_490860835.shtml 现在,很多公司都关心的一个问题是:要提高用户互动,到底采取哪一种 ...
- CSS:CSS Positioning(定位)
ylbtech-CSS:CSS Positioning(定位) 1.返回顶部 1. CSS Positioning(定位) position 属性指定了元素的定位类型. position 属性的四个值 ...
- hive调用MapReduce之后遇到kill command之后卡住或者一直开在MapReduce之前
https://blog.csdn.net/weixin_42158422/article/details/88876943
- 剑指offer——61平衡二叉树
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 题解: 方法一:使用深度遍历,判断每个节点是不是平衡二叉树,这种从上至下的方法会导致底层的节点重复判断多次 方法二:使用后序遍历判断,这种 ...
- 你真的懂return吗?
递归算法中什么时候用return啥时候不用呢? 使用2个例子来说明:快速排序和二分查找 # 二分查找def binarySearch (arr, l, r, x): # 基本判断 if r >= ...