题目大意:求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的更多相关文章

  1. [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)

    题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0​(n) be the number of positive diviso ...

  2. 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&= ...

  3. [SPOJ20174]DIVCNT3 - Counting Divisors (cube):Min_25筛

    分析 首先,STO ywy OTZ,ywy TQL%%%! 说一下这道题用min_25筛怎么做. 容易发现,对于所有质数\(p\),都满足\(f(p)=4\),于是我们就可以直接通过\([1,x]\) ...

  4. DIVCNT2&&3 - Counting Divisors

    DIVCNT2 - Counting Divisors (square) DIVCNT3 - Counting Divisors (cube) 杜教筛 [学习笔记]杜教筛 (其实不算是杜教筛,类似杜教 ...

  5. SPOJ 20713 DIVCNT2 - Counting Divisors (square)

    DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ​0​​ ...

  6. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  7. 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3

    Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...

  8. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  9. hdu 6069 Counting Divisors 筛法

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

随机推荐

  1. MATLAB生成exe脱离matlab运行可执行程序

    https://blog.csdn.net/u013007900/article/details/53485204 侵权即删. ———————————————— 版权声明:本文为CSDN博主「小木匠_ ...

  2. memcache常用操作

    Command Description Example get 读取键值 get mykey set 设置新键值 set mykey 0 60 5 add 新增键值 add newkey 0 60 5 ...

  3. JXOI2017 加法

    题目描述: 可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心. 于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整 ...

  4. flutter 使用keyboard_actions 关闭ios键盘

    项目中登录 输入账号密码 弹出的键盘 关闭不了,从而 引来一些问题, 1,第一次关闭 项目是在 最外层包裹一层,点击的时候进行关闭, return Scaffold( resizeToAvoidBot ...

  5. WinDbg中Check for invalid symbols or bad syntax(断点设置)解决办法

    基础知识 bp 程序运行过程中下断点 bu 程序未加载之前下断点 bl  列出所有断点 bc  清除断点 今天在调试驱动的时候 发现下好断点后 无法调试 WinDbg显示 kd> g Break ...

  6. jQuery 加载事件

    1. jquery加载事件实现 ① $(document).ready(function处理); ② $().ready(function处理); ③ $(function处理);  对第一种加载的封 ...

  7. 数据挖掘Aprior算法详解及c++源码

    [算法大致描述] Aprior算法主要有两个操作,扫描数据库+统计.计算每一阶频繁项集都要扫描一次数据库并且统计出满足支持度的n阶项集. [算法主要步骤] 一.频繁一项集 算法开始第一步,通过扫描数据 ...

  8. UVA 10005 Packing polygons(最小圆覆盖)

    裸的模板题 AC代码: #include<cstdio> #include<cmath> #include<algorithm> #include<iostr ...

  9. MySQL数据库(一)—— 数据库介绍、MySQL安装、基础SQL语句

    数据库介绍.MySQL安装.基础SQL语句 一.数据库介绍 1.什么是数据库 数据库即存储数据的仓库 2.为什么要用数据库 (1)用文件存储是和硬盘打交道,是IO操作,所以有效率问题 (2)管理不方便 ...

  10. Lung Nodule Detection------work log

    有时候真的不知道自己是怎么走上,模式识别,人工智能的这条路上的.但既然走上了这条路,我就没有理由荒废我所学到的东西.在学校里面研究了很长的时间的肺结节检测,但那都是只限于研究和写论文,现在我想把大家的 ...