すんまそん。力技です。

int is_a_sup_b(unsigned int n) {

  int c, p=0, buf[32] = {0};
  unsigned int i,d;

  while (n && (n & 1)==0) {
    ++buf[p];
    n >>= 1;
  }
  if (buf[p]) ++p;

  i = 2;
  d = 3;
  while (d<=n) {
    while (d<=n && (n % d)==0) {
  ++buf[p];
      n /= d;
    }
    if (buf[p]) ++p;
    d += i;
    i = 6 - i; // 4 と 2 を交互に
  }

  if (n != 1)
    ++buf[p++];

  c = buf[--p];

  while (p--) if (buf[p] != c) return 0;

  return 1;
}

a の b 乗の形であらわせるか?というのを求めます。
ただしaとbが具体的に何なのかは,んーと,簡単に分かるけど
ここでは求めてません。
あんまし試してないんで,検証よろしくです。

考え方はこう。
a^b は,素因数分解すると登場する因数の回数が揃ってるんですよね。
例えば 14^3 = 2744 は 2 * 2 * 2 * 7 * 7 * 7 で
2 も 7 も 3 回登場しますもんね。

#・・・今みんなが悩んでるのはここじゃないという罠?