题目大意:

$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. BigDecimal的精度舍入模式详解

    BigDecimal舍入模式介绍: 舍入模式在java.math.RoundingMode 里面: RoundingMode.CEILING :向正无限大方向舍入的舍入模式.如果结果为正,则舍入行为类 ...

  2. 排查java.lang.OutOfMemoryError: GC overhead limit exceeded

    帮助客户排查java.lang.OutOfMemoryError: GC overhead limit exceeded错误记录: 具体网址: https://support.oracle.com/e ...

  3. 定期访问WebLogic Server返回状态的脚本

    在运维过程中,经常要获悉WebLogic Server的状态以便于主动的维护,本文通过weblogic WLST脚本初步设计了一下 脚本大概为2个,一是WLST的py脚本,getStates.py c ...

  4. oracle 10g函数大全--转换函数

    chartorowid(c1) [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SELECT ...

  5. Python图像处理(8):边缘检測

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 此前已经得到了单个区域植株图像,接下来似乎应该尝试对这些区域进行分类识别.通过外形和叶脉进行植物种 ...

  6. 经典算法——Jump Game(II)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  7. hdu1863 畅通project(判定最小生成树)

    畅通project Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 解决Linux下3T硬盘分区只有2T(2199G)可用

    分区转换成GPT即可 sudo parted /dev/sdb 将MBR硬盘格式化为GPT mklabel gpt 之后可以看一下状态 print 整个硬盘空间只分一个区 mkpart primary ...

  9. 【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)

    [JAVA秒会技术之秒杀面试官]秒杀Java面试官——集合篇(一) [JAVA秒会技术之秒杀面试官]JavaEE常见面试题(三) http://blog.csdn.net/qq296398300/ar ...

  10. URL中的#号

    一.#的涵义 #代表网页中的一个位置.其右面的字符,就是该位置的标识符.比如, http://www.example.com/index.html#print 就代表网页index.html的prin ...