首先我们可以把答案差分,那么我们只需要求出\(1\)~\(x\)范围内的满足条件的数即可.

题目要求的应该是这个东西的个数:

\(l \leq a*b^c \leq r(1 \le a < b)​\)的个数

我们首先对于问题仔细分析一波,发现\(c>3\)显然不需要考虑.

  1. \(c>3\)且\(c\)是偶数.

显然\(a*b^{2k}=a*({b^k})^2\),显然如果\(a<b\)那么\(a<b^k(k>1)\)

  1. \(c>3\)且\(c\)是奇数.

显然\(a*b^{2k+1}=(a*b)*({b^k})^2\),显然如果\(a<b\)那么\(a<b^{k-1}(k>1)\)

所以现在我们成功把题目转换成了两种情况:\(c=2\)|\(c=3\)

单独计算\(c=2\)和\(c=3\)都十分的简单,但是极其有可能有这样子的情况:

\(a*x^2=b*y^3\)

这个时候我们就需要排除这种情况.

不妨先把\(a*x^2\)算出来,那么只需要计算满足\(b*y^3\)且\(a \ge x\)

\(a*x^2\)显然只需要枚举\(i \in [1,\sqrt[3]{x}]\)然后就是\(\sqrt{x/i}-i\),因为要排除掉\(a \ge x\)的情况.

现在问题就在于如何统计\(b*y^3 \leq x\)且\(a*x^2(a \ge x)\)

我们推一波式子:

下面是手写稿,主要是不想写\(LaTeX\)了.





/*
mail: mleautomaton@foxmail.com
author: MLEAutoMaton
This Code is made by MLEAutoMaton
*/
#include<bits/stdc++.h>
using namespace std;
const int M=430890,N=16820;
class SemiPerfectPower{
public:
vector<int>son[M],sum[N];
int mu[M],thr_out[M];
int pfg(long long x){
int l=0,r=3e8,ret=0;
while(l<=r){
int mid=(l+r)>>1;
if(1ll*mid*mid<=x){ret=mid;l=mid+1;}
else r=mid-1;
}
return ret;
}
int lfg(long long x){
int l=0,r=M,ret=0;
while(l<=r){
int mid=(l+r)>>1;
if(1ll*mid*mid*mid<=x){ret=mid;l=mid+1;}
else r=mid-1;
}
return ret;
}
long long solve(long long x){
long long ans=0;
for(int i=1;1ll*i*i*i<=x;i++)if(mu[i])ans+=pfg(x/i)-i;
for(int i=1;1ll*i*i*i*i<=x;i++)
if(!thr_out[i])
for(int j=1;j*j*j<=i;j++){
int d=__gcd(j*j,i);
if(!mu[i/d])continue;
int k=j*j/d,l=i/k,r=lfg(x/i)/k;
for(int u:son[i/d])ans+=mu[u]*(sum[u][r/u]-sum[u][l/u]);
}
return ans;
}
long long count(long long l,long long r){
mu[1]=1;
for(int i=1;i<M;i++)if(mu[i])for(int j=i<<1;j<M;j+=i)mu[j]-=mu[i];
for(int i=1;i<M;i++)if(mu[i])for(int j=i;j<M;j+=i)if(mu[j])son[j].push_back(i);
for(int i=2;i*i*i<M;i++)for(int j=i*i*i;j<M;j+=i*i*i)thr_out[j]=1;
for(int i=1;i<N;i++){
sum[i].resize(M/i+1);
sum[i][0]=0;
for(int j=1;j<M/i+1;j++)
sum[i][j]=sum[i][j-1]+(mu[i*j]!=0);
}
return solve(r)-solve(l-1);
}
};

TopCoder SRM 582 Div 1 - Problem 1000 SemiPerfectPower的更多相关文章

  1. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  2. TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame

    传送门:https://284914869.github.io/AEoj/558.html 题目简述  一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子.  这个 ...

  3. TopCoder SRM 566 Div 1 - Problem 1000 FencingPenguins

    传送门:https://284914869.github.io/AEoj/566.html 题目简述: 平面上有中心在原点,一个点在(r,0)处的正n边形的n个顶点.平面上还有m个企鹅,每个企鹅有一个 ...

  4. TopCoder SRM 561 Div 1 - Problem 1000 Orienteering

    传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...

  5. TopCoder SRM 559 Div 1 - Problem 900 CircusTents

    传送门:https://284914869.github.io/AEoj/559.html 题目简述: n个实心圆,两两没有交集,在第一个圆上找一个点,使得它到另外一个圆上某个点的最短距离的最小值尽量 ...

  6. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  7. TopCoder SRM 642 Div.2 1000 --二分+BFS

    题意: 给你一张图,N个点(0~N-1),m条边,国王要从0到N-1,国王携带一个值,当走到一条边权大于此值的边时,要么不走,要么提升该边的边权,提升k个单位花费k^2块钱,国王就带了B块钱,问能携带 ...

  8. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  9. Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索

    最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...

随机推荐

  1. Apollo 与 .net core

    appsettings配置内容 { "Apollo": { "AppId": "netcore", "Env": &qu ...

  2. EntityFramework进阶(一)- DbContext与ObjectContext互转

    本系列原创博客代码已在EntityFramework6.0.0测试通过,转载请标明出处 EF中我们常用的是DbContext作为上下文,如果要想获取元数据等信息还是要用到ObjectContext这个 ...

  3. stm32 触摸屏 XPT2046

    引脚功能描述 控制字的控制位命令 控制字节各位描述 单端模式输入配置 差分模式输入配置 时序 前8个时钟用来通过DIN引脚输入控制字节,接着的12个时钟周期将完成真正的模数转换,剩下的3个多时钟周期将 ...

  4. Android NDK 学习之Android.mk

    Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk  ...

  5. SQL SERVER-Job中Operators搬迁脚本

    选中operators按F7,然后选中对象,生成脚本 USE [msdb] GO /****** Object: Operator [DB_ITDESK] Script Date: 5/30/2019 ...

  6. OpenStack中虚拟机获取不到IP地址的解决方法

    OpenStack源码交流群: 538850354 系统环境: centos6.5 + icehouse多节点部署 问题描述: 使用测试镜像cirros,虚拟机实例可以正常启动,但是不能从IP池中获取 ...

  7. 【OF框架】使用IDbContextTransaction在框架中对多个实体进行事务操作

    准备 引用框架,按照规范建立数据库表及对应实体. 一.事务操作 关键代码 示例代码如下: //插入数据,使用数据库事务,不支持多连接. var dbContext = IoCHelper.Resolv ...

  8. Write-Off

    What is a Write-Off? Write-offis an accounting term referring to an action whereby the book value of ...

  9. Geohash 基本知识及 .NET 下计算相邻8个区域编码

    目录 一.简介 二.计算方法 三.GeoHash的精度 四.查找相邻8个区域的Geohash编码(.NET) 五.MySQL 中使用 GeoHash 最近项目中需要搜索周边的 POI 信息,查找的过程 ...

  10. git将一个分支的内容替换为另一分支内容

    假设我想将我的linux分支内容替换master分支的内容. # 切换到master分支 git checkout master # 再将本地的master分支重置成linux git reset - ...