Problem:
Score : 1600 points

Problem Statement

For a string S, let f(S) be the lexicographically smallest cyclic shift of S.
For example, if S = babca, f(S) = ababc because this is the smallest among all cyclic shifts (babca, abcab, bcaba, cabab, ababc).

You are given three integers X, Y, and Z.
You want to construct a string T that consists of exactly X as, exactly Y bs, and exactly Z cs.
If there are multiple such strings, you want to choose one that maximizes f(T) lexicographically.

Compute the lexicographically largest possible value of f(T).

Constraints

1 \leq X + Y + Z \leq 50

X, Y, Z are non-negative integers.

Input

Input is given from Standard Input in the following format:

X Y Z

Output

Print the answer.

Sample Input 1

2 2 0

Sample Output 1

abab

T must consist of two as and two bs.

If T = aabb, f(T) = aabb.

If T = abab, f(T) = abab.

If T = abba, f(T) = aabb.

If T = baab, f(T) = aabb.

If T = baba, f(T) = abab.

If T = bbaa, f(T) = aabb.

Thus, the largest possible f(T) is abab.

Sample Input 2

1 1 1

Sample Output 2

acb

Solution in C++ (GCC 5.4.1) (judge verdict: Accepted)

#include<set>
#include<cstdio>
#include<cctype>
#include<string>
inline int Read(){
	char a;
	int b;
	while(!isdigit(a=getchar()));
	b=a^'0';
	while(isdigit(a=getchar()))b=(((b<<2)+b)<<1)+(a^'0');
	return b;
}
int main()
{
	std::multiset<std::string> set;
	for(int i=Read();i;i--)set.insert("a");
	for(int i=Read();i;i--)set.insert("b");
	for(int i=Read();i;i--)set.insert("c");
	while(set.size()>1){
		std::string s=*set.begin(),t=*set.rbegin();
		set.erase(set.lower_bound(s));
		set.erase(set.lower_bound(t));
		set.insert(s+t);
	}
	printf("%s\n",(*set.begin()).c_str());
	return 0;
}