970. Powerful Integers

2023-12-21 16:19
文章标签 integers powerful 970

本文主要是介绍970. Powerful Integers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

970. 强整数

给定两个正整数 xy,如果某一整数等于 x^i + y^j,其中整数 i >= 0 且 j >= 0,那么我们认为该整数是一个强整数

返回值小于或等于 bound 的所有强整数组成的列表。

你可以按任何顺序返回答案。在你的回答中,每个值最多出现一次。

 

示例 1:

输入:x = 2, y = 3, bound = 10
输出:[2,3,4,5,7,9,10]
解释: 
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2

示例 2:

输入:x = 3, y = 5, bound = 15
输出:[2,4,6,8,10,14]

 

提示:

  • 1 <= x <= 100
  • 1 <= y <= 100
  • 0 <= bound <= 10^6

解法一

class Solution {
public:vector<int> powerfulIntegers(int x, int y, int bound) {unordered_set<int> us;int temp;if(x == 1 && y == 1) return bound > 1 ? vector<int>(1, 2) : vector<int>();else if(x == 1) {for(int i = 0; (temp = pow(y, i) + 1) < bound; i++) us.insert(temp);}else if(y == 1) {for(int i = 0; (temp = pow(x, i) + 1) < bound; i++) us.insert(temp);}else {int xi;for(int i = 0; (temp = (xi = pow(x, i)) + pow(y, 0)) <= bound; i++) {us.insert(temp);for(int j = 1; (temp = xi + pow(y, j)) <= bound; j++) {us.insert(temp);}}}return vector<int>(us.begin(), us.end());}
};

解法二

class Solution {
public:vector<int> powerfulIntegers(int x, int y, int bound) {int temp;unordered_set<int> us;for(int i = 0; i <= 19; i++) {for(int j = 0; j <= 19; j++) {if( (temp = pow(x, i) + pow(y, j)) > 0 && temp <= bound) us.insert(temp);}}return vector<int>(us.begin(), us.end());}
};

解法三

class Solution {
public:vector<int> powerfulIntegers(int x, int y, int bound) {int m = x == 1 ? 1 : log(bound) / log(x);int n = y == 1 ? 1 : log(bound) / log(y);int temp;unordered_set<int> us;for(int i = 0; i <= m; i++) {for(int j = 0; j <= n; j++) {if( (temp = pow(x, i) + pow(y, j)) <= bound) us.insert(temp);}}return vector<int>(us.begin(), us.end());}
};

思路:

解法一

注意区别x和y等于1的情况,如果两个都为1,那根据bound的值应该返回{2}或{}。如果x、y其中1个为1,就退化为成了一个变量的i次方求小于等于boud的问题。

如果两个都不为1,那就从i = 0开始:对于每一个i,遍历j从0开始的所有合法取值,将其添加到哈希表中,直到遇到一个i使其和大于bound。最后将其转为vector返回。

解法二

上一个解法逻辑有点复杂,解法二更简洁一些。

它基于这样一个隐含条件:如果x^i + y^j <= bound,那么一定有x^i < bound且y^j < bound(不含等于号,因为x^i 或 y^j至少等于1)。那么就一定有i < log(bound) / log(x)且j < log(bound) / log(y)。

因为bound最大为1000000,i最大(这时x应取2,i = log(1000000)/log(2))为19,对j同理。所以我们就遍历i、j从0到19,满足的话将其保存。

这里要判断加法溢出,如果i和j都比较大(比如都是19)其和就是负数,要判断其和大于0。

解法三

上一个解法是官方题解的思路。解法三与其类似,只是将原来i、j的上限19改为了计算出的值m、n。

令m = i < log(bound) / log(x),n = j < log(bound) / log(y)。

这个m、n分别就是我们要遍历的i和j的上限,遍历每一对i、j,如果小于等于bound就将其保存入us。

如果x和y其中有1,那就直接将上限设为1。

因为题上说明bound最大为1000000,所以不用担心加法溢出的情况。

2019/08/20 00:44

这篇关于970. Powerful Integers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520663

相关文章

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

Codeforces Round 970 (Div. 3)(ABCDEF)

Codeforces Round 970 (Div. 3) A:Sakurako's Exams 签到 题意:给定1,2的数量,判断是否能用加减符号使得这些1,2计算出0 void solve(){cin>>n>>m;if(n%2)cout<<"NO\n";else{if(m%2==0||n)cout<<"YES\n";else cout<<"NO\n";}return ;} B:S

Codeforces Round 970 (Div.3)

传送门 A. Sakurako's Exam 模拟,两个 2 能够自己变成 0,因此将 b 对 2 取余;多余的 2 还能跟两个 1 组合在一起变成 0;最后判断剩余的 1 的数量是奇数还是偶数。 #include <bits/stdc++.h>using namespace std;inline int read() {int x = 0, f = 1; char c = getchar

Splay树(区间更新)—— POJ 3468 A Simple Problem with Integers

对应POJ 题目:点击打开链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 72765 Accepted: 22465Case Time Limit: 2000MS Description You have N integers, A1

Codeforces Round 970 (Div. 3)(A~H)

​​​​​题目链接​​​​​​​​​​​​​​​​​​​​​ A 当 a 为奇数的时候,无论如何配对都无法将最后一个 1 减去; 当 a 为偶数的时候,b 也偶数,自然可以内部通过加减操作变成 0;当 b 为奇数的时候,只有当 a = 0 的时候,无法变成 0,因为 a 为偶数,且不为 0,那么一定可以拿出两个 1 和 b 中的一个配对,然后 a 和 b 都为偶数了。 代码 #includ

codeforces Round 970 (Div. 3)(A-F)

文章目录 [Codeforces Round 970 (Div. 3)](https://codeforces.com/contest/2008)A-[Sakurako's Exam](https://codeforces.com/contest/2008/problem/A)B-[Square or Not](https://codeforces.com/contest/2008/prob

Codeforces Round 970 (Div. 3) A~F

封面原图 画师青眼鏡 Codeforces Round 970 (Div. 3) A - Sakurako’s Exam 题意 给你a个1和b个2,它们的顺序和中间的加减符号随意,问你能不能写成结果为0的算式 思路 假设全部都是正的加上去,然后变一个2会使最终结果减4,变一个1会减2,看最后能不能减到0即可 代码 #include <bits/stdc++.h>u

Leetcode 3272. Find the Count of Good Integers

Leetcode 3272. Find the Count of Good Integers 1. 解题思路2. 代码实现 题目链接:3272. Find the Count of Good Integers 1. 解题思路 这一题我思路上是比较暴力的,就是典型地分步骤执行: 找出所有的可能构成回文的长度为n的字符组合对于任意字符组合,判断其是否可以构成一个被k整除的回文序列考察这个字符组

leetcode371 Sum Of Integers 不用加法计算两个整数的和

Description Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 解法 思路: 首先不能用”+”、” - “符号,那么计算两个数的和也就只能用“位运算符”

NYOJ--993 How many integers can you find

How many integers can you find 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 1 描述 给你三个数,n,m1,m2,找出所有小于n的能被m1或m2整除的数的个数。 输入 输入包含多组测试数据,每组数据占一行。 0<n<2^31,0<m1,m2<=10。 输出 每组数据输出占一行。 样例输入 12 2 3 样例输出