题目大意:

$2<=a,b<=n$ 求 $a^b$能表示多少不同的正整数。

原题中n=100,可以直接暴力求解,常见的两种解法是写高精度或者取对数判断相等。 直觉告诉我应该有更加优秀的解法,于是翻了下discuss,找到了一种复杂度介于O(n)和O(nlognlogn)的解法,拿出来分享一下。

首先来看一个性质:

对于一个$a$,可以找到最小的$a_0$,使得$a=a_0^k$.

比如$8^4=4^6=2^{12}$ 都是等价的。

对于某个$a^b = (a_0^k)^{b}$, 它只可能和某些$a_0^{b_1}$,$(a_0^2)^{b_2}$,$(a_0^3)^{b_3}\ \cdots\ (a_0^{k-1})^{b_{k-1}}$  等价。

我们来看 $a_0^i\ \ (1<=i<k)$ 与 $a_0^k$ 所能表示的那些数会重复。

显然$a_0^{lcm(i,k)}$ $a_0^{2*lcm(i,k)}$ $a_0^{3*lcm(i,k)\ \cdots}$这些都是可以同时被$a_0^i\ \ (1<=i<k)$ 与 $a_0^k$ 表示的。

对应到$a_0^k$的指数分别是 $\frac{lcm(i,k)}{k}$  $2*\frac{lcm(i,k)}{k}$  $3*\frac{lcm(i,k)}{k}\ \cdots$  把这些指数用一个bool数组标记,最后就可以得到以$a_0^k$为基能表示多少个数。 而且这个值和$a_0$的值无关,只和k有关,记为cnt[k],所以可以预处理。

最后统计答案。 枚举$a_0(不能表示成另外一个数的幂的数)$把$a_0\ a_0^2\ a_0^3\ \cdots a_0^k$ 一起考虑,对答案的贡献就是cnt[1]+cnt[2]+...cnt[k].

具体实现看代码:  实测n=100w 本地运行只要0.2s左右。

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; typedef long long ll;
#define N 1000001
#define M 21 ll cnt[N];
bool flag[N];
bool vis[M][N]; int gcd(int x,int y)
{
int tmp;
while (y)
{
tmp=x%y;
x=y; y=tmp;
}
return x;
} int lcm(int x,int y){return 1ll*x*y/gcd(x,y);} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); int n,m=; scanf("%d",&n);
for (int i=;i<=n;i<<=,m++); m--; for (int i=;i<=m;i++)
{
for (int j=;j<i;j++)
{
int l=lcm(i,j),len1=l/j,len2=l/i;
for (int k=;k*len1<=n;k++) vis[i][k*len2]=true;
}
}
cnt[]=n-;
for (int i=;i<=m;i++)
{
cnt[i]=cnt[i-];
for (int j=;j<=n;j++) if (!vis[i][j]) cnt[i]++;
} ll ans=;
for (int i=;i<=n;i++)
{
if (flag[i]) continue;
int p=; ll x=i;
do
{
flag[x]=true;
p++; x*=i;
}while (x<=n);
ans+=cnt[p];
}
cout<<ans<<endl;
return ;
}

Distinct powers (Project Euler 29 加强版)的更多相关文章

  1. Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )

    题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...

  2. (Problem 29)Distinct powers

    Consider all integer combinations ofabfor 2a5 and 2b5: 22=4, 23=8, 24=16, 25=32 32=9, 33=27, 34=81, ...

  3. Python练习题 042:Project Euler 014:最长的考拉兹序列

    本题来自 Project Euler 第14题:https://projecteuler.net/problem=14 ''' Project Euler: Problem 14: Longest C ...

  4. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  5. Python练习题 031:Project Euler 003:最大质因数

    本题来自 Project Euler 第3题:https://projecteuler.net/problem=3 # Project Euler: Problem 3: Largest prime ...

  6. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  7. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  8. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  9. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

随机推荐

  1. linux 逻辑卷管理 调整分区大小

    测试机各种报错,创建个目录都报错,df看了一下,发现VolGroup-lv_root 100%,虚拟磁盘满了,怎么办呢 1,解决过程 # df -h //查看分区 # umount /home //取 ...

  2. Javascript高级程序设计-问答模式

    1.谈谈javascript数组排序方法sort()的使用,重点介绍sort()参数的使用及其内部机制 sort的实现的功能类似JAVA的比较器,数据排序从多维数组的第一维开始排序可以自己定义排序方法 ...

  3. iOS:CocosPods的装配和配置ReactiveCocoa

    关于CocosPods的安装和配置ReactiveCocoa 1. CocoaPods和ReactiveCocoa的安装 CocoaPods是iOS最常用最有名的类库管理工具 使用ReactiveCo ...

  4. Windows数据备份软件Deltacopy-数据备份与还原

    官方网站:http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp System Requirements XP, 2000, 2003, 2008, Vi ...

  5. Hibernate参数设置一览表

    属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Di ...

  6. Mybatis c3p0 整合

    1.下载c3p0 2.实现 UnpooledDataSourceFactory package com.joinhealth.esb.db; import org.apache.ibatis.data ...

  7. 记一次R的可视化使用-生成城市各个景点的多边形图

    项目中须要用到全国各个城市的景点坐标范围.须要人工审核各个景点的数据正确性和各个景点之间的距离分布.首先想到的就是使用R绘制每一个景点的多边形区域. 首先通过python,依据数据生成R画图代码,当然 ...

  8. iOS活体人脸识别的Demo和一些思路

    代码地址如下:http://www.demodashi.com/demo/12011.html 之前公司项目需要,研究了一下人脸识别和活体识别,并运用免费的讯飞人脸识别,在其基础上做了二次开发,添加了 ...

  9. 通过内存映射文件来颠倒文本内容(暂没有处理Unicode和换行符)

    // ReverseFileDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> ...

  10. Matlab、R向量与矩阵操作

    Matlab.R向量与矩阵操作   描    述 Matlab R 1 建立行向量v=[1 2  3 4] v=[1 2 3 4] v<-c(1,2,3,4)或v<-scan(),然后输入 ...