#include <stdio.h> #include <string.h> //콤비네이션 함수를 "동적 계획법"으로 짜볼까요 long com[201][101]; long combi(int n, int r){ if(com[n][r] != -1 ) return com[n][r]; else if(n == 0) return 0; else if(r== n || r == 0){ com[n][r] = 1; return 1; } else{ com[n][r] = combi(n-1,r-1) + combi(n-1,r); return com[n][r];} } void make_temp_result(int m_temp, int k_temp); void make_result(); char result[201] = { 0, }; //null을 위한 한칸 char temp_result[201] = { 0, }; //조합이 너무 커지는 경우가 발생할 경우 앞 부분이 '-'가 연속해서 나오므로 처음 나온 'o'부터의 문자열을 '거꾸로 순서로'!! 여기에 저장 int n,m,k; int num_of_maketempresult; //함수 실행 횟수 int main(){ for(int i=0;i<201;i++){for(int j=0;j<101;j++) com[i][j] = -1;} int tc; scanf("%d",&tc); for(int i=0;i<tc;i++){ //memset으로 초기화!!를 해줘야되용 memset(result,0,m+n); memset(temp_result,0,m+n); num_of_maketempresult = 0; scanf("%d%d%d", &n,&m,&k); make_result(); printf("%s\n",result); } return 0; } void make_result(){ make_temp_result(m,k); for(int i=0;i<m+n - strlen(temp_result);i++) result[i] = 45; for(int i=0;i<strlen(temp_result);i++) result[m+n-1-i] = temp_result[i]; } void make_temp_result(int m_temp, int k_temp){ int i; for(i=m_temp;k_temp>combi(i,m_temp);i++); temp_result[i-1] = 111; if(num_of_maketempresult == 0){ for(int j=0;j<i-1;j++) temp_result[j] = 45; } //해당 줄은 앞을 전부 '-'로 만들어줍니다! num_of_maketempresult++; if(num_of_maketempresult < m) make_temp_result(m_temp-1, k_temp - combi(i-1,m_temp)); }