B
square1001 は、電光掲示板に整数 1 が表示されているのを見ました。
彼は、電光掲示板に対して、以下の操作 A, 操作 B をすることができます。
操作 A: 電光掲示板に表示する整数を「今の電光掲示板の整数を 2 倍にしたもの」に変える。
操作 B: 電光掲示板に表示する整数を「今の電光掲示板の整数に K を足したもの」に変える。
square1001 は、操作 A, 操作 B 合計で N 回 行わなければなりません。 そのとき、N 回の操作後の、電光掲示板に書かれている整数として考えられる最小の値を求めなさい。
# include<iostream>
using namespace std;
int main() {
int N, K;
cin >> N >> K;
int start = 1;
for (int i = 0; i < N; ++i) {
if (start * 2 <= start + K)
start *= 2;
else
start += K;
}
cout << start << endl;
return 0;
}
C
E869120 は、宝物が入ってそうな箱を見つけました。
しかし、これには鍵がかかっており、鍵を開けるためには英小文字からなる文字列 S が必要です。
彼は文字列 S' を見つけ、これは文字列 S の 0 個以上 |S| 個以内の文字が ? に置き換わった文字列であることも分かりました。
ただし、文字列 A に対して、|A| を「文字列 A の長さ」とします。
そこで、E869120 はヒントとなる紙を見つけました。
条件1:文字列 S の中に連続する部分文字列として英小文字から成る文字列 T が含まれている。
条件2:S は、条件1を満たす文字列の中で辞書順最小の文字列である。
そのとき、鍵となる文字列 S を出力しなさい。
ただし、そのような文字列 S が存在しない場合は代わりに UNRESTORABLE と出力しなさい。
制約
1≤|S'|,|T|≤50
S' は英小文字と ? から成る
T は英小文字から成る
# include <iostream>
# include<string>
using namespace std;
int main() {
string S, T;
cin >> S >> T;
bool flag1 = true;
bool flag2 = false;
for (int j = S.size()-T.size(); j >=0; --j) {
flag1 = true;
if (S[j] == T[0] || S[j] == '?') {
for (int k = j; k < T.size() + j; ++k) {
if (S[k] == '?'||S[k]==T[k-j]) {
continue;
}
else {
flag1 = false;
break;
}
}//可能であることが分かったのでSの一部をTに変える作業
if (flag1) {
for (int k = j; k < j + T.size(); ++k) {
S[k] = T[k - j];
}
flag2 = true;
j -= 100;
}
}
}
//そもそも可能かどうか.可能なら?を全部aに変える
if (flag2) {
for (int i = 0; i < S.size(); ++i) {
if (S[i] == '?') {
S[i] = 'a';
}
}
cout << S << endl;
}
else {
cout << "UNRESTORABLE" << endl;
}
}