题目大意:
  给定$n(n\leq10^{11})$,求$\displaystyle\sum_{i=1}^n[\tau(i)=4]$。

思路:
  设$p,q$为不相等的质数,则满足$\tau(i)=4$的数$i$一定可以表示成$pq$或$p^3$。
  对于$i=pq$的情况,可以先线性筛预处理出$\sqrt n$以内的质数,然后用LOJ6235的方法,用洲阁筛求出DP数组$f$。加上$last[j]-1$就是当$p_i^2>j$时不用$-1$转移,也就是加上了$p_i^2>j$的质数个数。此时$f[cnt+1-p_i]$表示的就是$\pi(n/p_i)-\pi(\sqrt n)$。统计答案时,枚举素数$p_i$,求$\sum_{p_i\leq\sqrt n}(\pi(n/p_i)-\pi(p_i))$即可。
  对于$i=p^3$的情况,直接在筛出来的质数中二分答案即可。
  时间复杂度$O\left(\frac{n^{\frac34}}{\ln n}\right)$。

细节:
  $n=1$时二分会挂掉,需要特判。

 #include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<functional>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int LIM=,P=;
bool vis[LIM];
int lim,p[P],sum[LIM],last[LIM*],cnt;
int64 n,val[LIM*],f[LIM*];
inline void sieve() {
for(register int i=;i<=lim;i++) {
if(!vis[i]) p[++p[]]=i;
sum[i]=sum[i-]+!vis[i];
for(register int j=;j<=p[]&&i*p[j]<=lim;j++) {
vis[i*p[j]]=true;
if(i%p[j]==) break;
}
}
}
int main() {
lim=sqrt(n=getint());
sieve();
for(register int64 i=;i<=n;i=n/(n/i)+) {
val[++cnt]=n/i;
}
std::reverse(&val[],&val[cnt]+);
std::copy(&val[],&val[cnt+],&f[]);
for(register int i=;i<=p[];i++) {
for(register int j=cnt;j;j--) {
const int64 k=val[j]/p[i],pos=k<=lim?k:cnt+-n/k;
if(k<p[i]) break;
f[j]-=f[pos]+last[pos]-i+;
last[j]=i;
}
}
int64 ans=;
for(register int i=;i<=cnt;i++) {
f[i]+=last[i]-;
}
for(register int i=;i<=p[];i++) {
ans+=f[cnt+-p[i]]-i;
}
if(n!=) ans+=std::upper_bound(&p[],&p[p[]]+,floor(pow(n,./)))-&p[];
printf("%lld\n",ans);
return ;
}

最新文章

  1. UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一)
  2. 如何用70行Java代码实现深度神经网络算法(转)
  3. [Qt5] How to connect c++ with QML
  4. C语言的OOP实践(OOC)
  5. 和为S的两个数VS和为S的连续正数序列
  6. ASP缓存类收集
  7. 《征服c指针》学习笔记-----统计文本单词数目的程序word_count
  8. kiss框架学习
  9. Android + OpenCV - Finding extreme points in contours
  10. .NET 通过 Autofac 和 DynamicProxy 实现AOP
  11. find命令基础讲解
  12. python链接mysql
  13. 获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级(微信小程序开发)
  14. centOS6.0虚拟机ip配置
  15. Android Studio 日志工具
  16. 解决gitk显示文件内容中文乱码
  17. MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
  18. C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送
  19. Java Script 基础总结
  20. 公司架构理解 - 千万 pv 网站

热门文章

  1. Kali 网络配置
  2. WPF实现QQ群文件列表动画(二)
  3. Python学习-day14-前台总结
  4. 关于JavaWeb开发的一些感悟
  5. Mysql实战之索引
  6. webpack命令
  7. JavaScript内存分配
  8. 逆序对(inversion)
  9. Bridges
  10. String 类详解