#include<stdio.h>

/* aが0から9までを1つずつ含む数なら1を，そうでなければ0を返す関数*/
int check(int a_upper, int a_lower)
{
  int flag[10];/*出現したら1になるフラグ*/
  long i;
  /*フラグの初期化*/
  for(i = 0;i < 10;i++) flag[i] = 0;
  if (a_lower < 10) return 0;  /* a_lowerは3桁なので9以下なら00xとなる */
  for(i = a_lower; i > 0; i = i / 10)
    if(flag[i % 10] == 1) return 0; /* flag[i%10]が1ならすでに出現した数なので0を返す*/
    else flag[i % 10] = 1;          /*フラグを1にする*/
  if (a_lower < 100) flag[0] = 1;  /* a_lowerは 0xy という数 */
  for(i = a_upper; i > 0; i = i / 10)
    if(flag[i % 10] == 1) return 0; /* flag[i%10]が1ならすでに出現した数なので0を返す*/
    else flag[i % 10] = 1;          /*フラグを1にする*/
  return 1;/*0から9まで重複して出現する数がなければ1を返す*/
}

main()
{
  long a_upper,a_lower;/*aの上位7桁と下位3桁*/
  long i_upper,i_lower;/*iの上位7桁と下位3桁*/
  long tmp;
  /*探索する範囲はsqrt(1023456789)からsqrt(9876543210) */
  /*   -->  31992から99380までを探索する*/
  for(i_upper = 31;i_upper <= 99 ;i_upper++){
    for(i_lower = 0;i_lower <= 999;i_lower++){
      if(i_upper == 99 && i_lower > 380) continue;
      if(i_upper == 31 && i_lower < 992) continue;
      /*iの2乗を計算*/
      tmp = i_lower * i_lower;
      a_upper =  2*i_upper*i_lower +
        i_upper * i_upper*1000 + tmp/1000;
      a_lower = tmp % 1000;
      /*0から9までを1つずつ含む数なら出力する*/
      if(check(a_upper, a_lower)) /* a_lowerが2桁の数のとき0を書く */
        printf("%d%s%d\n", 
                a_upper, a_lower < 100 ? "0" : "", a_lower);
    }
  }
}
