mojo's Blog

#729 (Div. 2) B - Plus and Multiply 본문

코드포스

#729 (Div. 2) B - Plus and Multiply

_mojo_ 2021. 7. 4. 02:17

문제 링크 => Problem - B - Codeforces

 

Problem - B - Codeforces

 

codeforces.com


Problem tags : constructive algorithms, math, number theory 

 

문제의 조건을 보면 다음과 같다.

  • 1 is in this set.
  • If x is in this set, xa and x+b both are in this set.

예를 들어서 a=3, b=5 라고 가정해보자.

 

이때 1은 기본적으로 set에 포함된다.

 

그리고 두번째 조건을 통해 1 * 3 = 3 , 1 + 5 = 6 으로 3, 6 값이 set에 포함된다.

 

3을 기준으로 보면? => 3 * 3 = 9, 3 + 5 = 8 으로 9, 8 값이 set에 포함된다.

 

6을 기준으로 보면? => 6 * 3 = 18, 6 + 5 = 11 으로 18, 11 값이 set에 포함된다.

 

이때 n 값이 a, b의 곱셈과 덧셈 operation 을 통하여 만들어지는지 확인해줘야 한다.

 

그러나 n, a, b 값이 최소 1 부터 최대 10^9 까지로 주어지므로 덧셈 operation 을 사용하는것은 최대한 비효율적인 것임을 나중에야 파악하게 되었다.

 

따라서 곱셈 operation 을 적용하고 그 후에 덧셈 operation 을 하도록 구현하는것이 맞는걸 알 수 있다.

 

그러나... a 값이 1인 경우? => 1에 1을 곱하면 계속 1이 되므로 결국 덧셈 operation 을 적용해야 한다.

 

따라서 두가지 Case 를 나눴다.

 

Case 1 : a 값이 1인 경우 => (n - 1) % b 값이 0 인 경우 즉, 1+b+b+...+b 값이 결국 n 이 되는지 파악만 하면 끝이다.

 

Case 2 : a 값이 2이상인 경우 => 다음과 같은 과정을 거쳐서 조건이 만족하는 경우를 찾도록 하였다.

   1) 1 + x = n => x 값이 b의 덧셈 operation 으로 만들어지는 경우 ( x % b == 0 )

   2) a + x = n => x 값이 b의 덧셈 operation 으로 만들어지는 경우 ( x % b == 0 )

   3) a^2 + x = n => x 값이 b의 덧셈 operation 으로 만들어지는 경우 ( x % b == 0 )

   ...

   c-1) a^c + x = n => x 값이 b의 덧셈 operation 으로 만들어지는 경우 ( x % b == 0 )

 

x 값이 양수일때까지 위 과정을 반복해주면서 x % b == 0 을 만족하도록 하는 c 값이 발견될 경우 set에 포함되는것임을 알 수 있다.

 

이때 시간 복잡도는 O(logN) 임을 알 수 있다.


풀이 code

#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'

using namespace std;

void test() {
	long long n, a, b;
	cin >> n >> a >> b;
	if (a == 1) {
		if ((n - 1) % b == 0) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	else {
		long long t = 1;
		while (1) {
			long long x = n - t;
			if (x < 0) break;
			if (x % b == 0) {
				cout << "Yes"<<endl;
				return;
			}
			t *= a;
		}
		cout << "No" << endl;
	}
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		test();
	}


	return 0;
}

 

'코드포스' 카테고리의 다른 글

#738 (Div.2) C - Mocha and Hiking  (0) 2021.08.16
#738 (Div.2) B - Mocha and Red and Blue  (0) 2021.08.16
#736 (Div.2) C - Web of Lies  (0) 2021.08.02
#732 (Div.2) B - AquaMoon and Stolen String  (0) 2021.07.12
#727 (Div.2) C - Stable Groups  (0) 2021.07.05
Comments