Official

A - Octave Editorial by sheyasutaka


初心者の方へ

実装方針

この問題にはさまざまな実装方針が考えられます.

方針 1: ループ

\(X\)\(2\) 倍する」という操作を \(Y\) 回繰り返し,得られた \(X\) の値を出力します.

方針 2: シフト演算や冪乗演算

主要なプログラミング言語の多くは,\(2^Y\) の値を高速に得る手段をもちます.

たとえば C++ ではシフト演算 1 << y で,Python では冪乗演算 2 ** y で得られます.

方針 3: 場合分け

\(Y\) の値が \(1,2,3\)\(3\) 通りしかないので,条件分岐によって以下の操作を行えばよいです.

  • \(Y=1\) の場合は \(X \times 2\) の値を出力する.
  • \(Y=2\) の場合は \(X \times 4\) の値を出力する.
  • \(Y=3\) の場合は \(X \times 8\) の値を出力する.

実装例

方針 1: ループ

C++ では for 文によってループを書くことができます.

#include <iostream>
using std::cin;
using std::cout;

int main (void) {
	int x, y;
	cin >> x >> y;

	int ans = x;
	for (int i = 0; i < y; i++) ans *= 2;

	cout << ans << "\n";
	
	return 0;
}

Python では for 文と range 関数を組み合わせることでループを書くことができます.

x, y = map(int, input().split())

ans = x
for i in range(y):
	ans *= 2

print(ans)

方針 2: シフト演算・演算

C++ では 1 << y によって \(2^Y\) を表すことができます.この構文は \(2\) の非負整数乗にのみ使えます.

#include <iostream>
using std::cin;
using std::cout;

int main (void) {
	int x, y;
	cin >> x >> y;

	int ans = x * (1 << y);

	cout << ans << "\n";
	
	return 0;
}

Python では 2 ** y によって \(2^Y\) を表すことができます.この構文は \(2\) 冪に限らず任意の値の冪乗に使えます.

x, y = map(int, input().split())

ans = x * (2 ** y)

print(ans)

なお,C++ では pow を,Python では math.pow を使うこともできるが,これらの関数は戻り値として浮動小数点数を返すため,精度落ちや出力形式ミスに十分注意する必要があります.

方針 3: 場合分け

C++ では if-else 文によって条件分岐を実現できます.

#include <iostream>
using std::cin;
using std::cout;
using std::cerr;

int main (void) {
	int x, y;
	cin >> x >> y;

	int ans;
	if (y == 1) {
		ans = x * 2;
	} else if (y == 2) {
		ans = x * 4;
	} else if (y == 3) {
		ans = x * 8;
	}

	cout << ans << "\n";
	
	return 0;
}

Python では if-elif 文によって条件分岐を実現できます.

x, y = map(int, input().split())

if y == 1:
	ans = x * 2
elif y == 2:
	ans = x * 4
elif y == 3:
	ans = x * 8

print(ans)

この問題では \(Y\) の値が \(1,2,3\) のいずれかであることが保証されているので,いずれでもない場合の動作を書かなくても正常に動作します.

posted:
last update: