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 ...
随机推荐
- ANdroid手机屏幕反横向等参数设定
经过我一番百度和看Android文档,我才发现,Android对旋转屏,特别是只有横屏或者竖屏虽重力旋转的支持是到Android4.3.1才有完美支持的 unspecified - 默认值,由系统选择 ...
- 运行连接Oracle数据库时,Idea报错: Error : java 不支持发行版本5
按照上面的截图步骤,一步步往下走,再运行程序时就不会报错了. 原文链接:https://blog.csdn.net/qq_22076345/article/details/82392236 感谢原文作 ...
- git常用操作命令归纳
git开始 全局配置:配置用户名和e-mail地址 $ git config --global user.name"Your Name" $ git config --global ...
- Magento用SQL语句开发篇
有时为了调试magento,需要获取当前的查询sql语句,在magento中获取SQL语句,这里我们通过$collection->getSelectSql(true)来调试sql 1 $coll ...
- thinkphp IP获取和定位
系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...
- Python实现中英文翻译方法总结
#Author:Chenglong Qian #Copyright :Chenglong Qian import json import requests import re import os im ...
- (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...
- P1537 弹珠
P1537 弹珠 题目描述 玛莎和比尔各自有自己的弹珠收藏.他们想重新分配收藏品,使两人能平等拥有弹珠.如果所有的弹珠的价值相同,那么他们就可以平分.但不幸的是,有一些弹珠更大,或者更美丽,所以,玛莎 ...
- 计算1到N中包含数字1的个数
转自:http://pandonix.iteye.com/blog/204840 Mark N为正整数,计算从1到N的所有整数中包含数字1的个数.比如,N=10,从1,2...10,包含有2个数字1. ...
- 改变IntelliJ IDEA 中的system和config/plugins的默认C盘的路径
1,问题,在为idea在线安装插件时,如JProfiler,会默认安装到C盘,而本人则是希望安装到软件所在的D盘目录下,那么如何修改呢: C:\Users\xxx\.IntelliJIdea\conf ...