Distinct powers (Project Euler 29 加强版)
题目大意:
$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 加强版)的更多相关文章
- 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 ...
- (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, ...
- Python练习题 042:Project Euler 014:最长的考拉兹序列
本题来自 Project Euler 第14题:https://projecteuler.net/problem=14 ''' Project Euler: Problem 14: Longest C ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 031:Project Euler 003:最大质因数
本题来自 Project Euler 第3题:https://projecteuler.net/problem=3 # Project Euler: Problem 3: Largest prime ...
- [project euler] program 4
上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- 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 ...
随机推荐
- nginx+vue实例纪录
参考:http://www.cnblogs.com/wuac/p/6406843.html 新建工作目录vuepro,命令行之行命令:vue init webpack vue-test (项目默认的名 ...
- linux上MySQL改动password的各种方法,yc整理
MySQL改动password的各种方法 整理了下面四种在MySQL中改动rootpassword的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -uroot my ...
- Node.js meitulu图片批量下载爬虫1.03版
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- 如何注册ocx文件
32位系统: 将文件放到c:\windows\system目录注册 运行:Regsvr32 c:\windows\system\xxx.ocx取消注册运行:Regsvr32.exe /u c:\win ...
- 【原】使用StarUML画用例图
在写一份升级方案的时候,发现文字描述半天,好多句子,依然不容易被人看明白,使用visio画了个流程图,后来觉得画个时序图是最清晰得了. 于是在找了一个工具: startUML,当然,做时序图,建模之类 ...
- libevent2源码分析之一:前言
event的本质 libevent2中的event的本质是什么?只要是非同步阻塞的运行方式,肯定遵循事件的订阅-发布模型.通过event_new的函数原型可以理解,一个event即代表一次订阅,建立起 ...
- Android项目-几种常见的应用架构
android两种Tab分页的方式:TabActivity和ActivityGroup http://www.fengfly.com/plus/view-209429-1.html 1.单个Activ ...
- YII用户注冊和用户登录(五)之进行session和cookie分析 ,并在前后区分session和cookie
5 进行session和cookie分析 ,并在前后区分session和cookie: 记住登录状态 这样下次再登录站点的时候.就不用反复输入username和password. 是浏览器的cooki ...
- 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
模型的表示 场景:物品或模型的集合 任何物品都可以用三角形网络逼近表示.我们经常用以下术语描述三角形网络:多边形(polygons).图元(primitives).网络几何单元(mesh geomet ...
- 通过Spring使用远程访问和web服务
http://docs.huihoo.com/spring/zh-cn/remoting.html Spring2 提供的remote包学习笔记