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 ...
随机推荐
- node js实战:带数据库,加密的注册登录表单
demo 注册效果: 登陆效果: 数据库截图: 数据库操作 db.js //这个模块里面封装了所有对数据库的常用操作 var MongoClient = require('mongodb ...
- centos7-关闭 rpcbind 服务
1.关闭 rpcbind 服务 sudo systemctl disable rpcbind 2.关闭开机自启动 sudo systemctl disable rpcbind 3.立即执行关闭 sy ...
- 赋能时空云计算,阿里云数据库时空引擎Ganos上线
随着移动互联网.位置感知技术.对地观测技术的快速发展,时空信息已从传统GIS行业渗透到大众应用及各行各业.从静态POI(兴趣点)到APP位置信息,从导航电子地图到车辆行驶轨迹,从卫星影像到三维城市建模 ...
- vue基础二
1.vue实例 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的.在实例化 Vue 时,需要传入一个选项对象,它可以包含数据.模板.挂载元素.方法.生命周期钩子等选 ...
- 质数密度+思维——cf1174D
/* 构造 n个点的无向图,无重边自环 边数e也是质数 点的度数也是质数 */ #include<bits/stdc++.h> #include<vector> using n ...
- 3-基于LoG的特征检测子
- LInux多线程编程----线程特定数据的处理函数
1.pthread_key_t和pthread_key_create() 线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了?大家都知道,在多线程程 ...
- angularjs 中 Factory,Service,Provider 之间的区别
本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...
- vscode 编写Python走过的坑
1,在使用vscode 中import turtle 这个模块, 再调用t = turtle.Pen(),始终提示无法找到turtle模块 2.可是使用terminal 中调用turtle模块,没有问 ...
- 超好用的thinkphp5.0/thinkphp5.1分页插件!详细使用步骤(内附代码)
效果 tp5.0使用方法 page下载地址:进入下载页面 提取码:s75k 1,把page文件夹整个目录复制到 目录extend下 2,修改默认配置 app/config.php 把里面的 'pagi ...