Problem:
パティシエ

ケーキ屋さんが、まちまちな大きさのロールケーキをたくさん作りました。あなたは、このケーキを箱に並べる仕事を任されました。

ロールケーキはとてもやわらかいので、他のロールケーキが上に乗るとつぶれてしまいます。ですから、図(a) のように全てのロールケーキは必ず箱の底面に接しているように並べなければなりません。並べ替えると必要な幅も変わります。

図(a)

図(b)

n 個のロールケーキの半径 r1, r2, ..., rn と箱の長さを読み込み、それぞれについて、箱の中にうまく収まるかどうか判定し、並べる順番を工夫すると箱に入る場合は "OK"、どう並べても入らない場合には "NA"を出力するプログラムを作成してください。

ロールケーキの断面は円であり、箱の壁の高さは十分に高いものとします。 ただし、ロールケーキの半径は 3 以上 10 以下の整数とします。つまり、ケーキの半径に極端な差はなく、図(b) のように大きなケーキの間に小さなケーキがはまり込んでしまうことはありません。

Input

入力は複数のデータセットからなります。各データセットは以下の形式で与えられます。

W r1 r2 ... rn

最初に箱の長さを表す整数 W (1 ≤ W ≤ 1,000) が与えられます。 続いて、空白区切りで各ロールケーキの半径を表す整数 ri (3 ≤ ri ≤ 10) が与えられます。ケーキの個数 n は 12 以下です。

データセットの数は 50 を超えません。

Output

データセットごとに OK または NA を１行に出力してください。

Sample Input

30 4 5 6
30 5 5 5
50 3 3 3 10 10
49 3 3 3 10 10

Output for the Sample Input

OK
OK
OK
NA

Solution in C (judge verdict: Time Limit Exceeded)

#include<stdio.h>
#include<string.h>
#include<math.h>

int rs[12];
int rsize;
double w;
double calc(){
  int i;
  double ans=(double)(rs[0]+rs[rsize-1]),buf;
  for(i=0;i<rsize-1;i++){
    if(rs[i]==rs[i+1]){
      ans+=(double)(rs[i]+rs[i+1]);
    }else{
      buf=(double)(rs[i]>rs[i+1]?rs[i]-rs[i+1]:rs[i+1]-rs[i])/(double)(rs[i]+rs[i+1]);
      buf=(double)(rs[i]+rs[i+1])*sqrt(1-buf*buf);
      ans+=buf;
    }
  }
  return ans;
}
int s(int n){
  int i,buf;
  double c;
  if(n==rsize){
    c=calc();
    if(c<=w){
      return 1;
    }else{
      return 0;
    }
  }
  for(i=n;i<rsize;i++){
    buf=rs[i];
    rs[i]=rs[n];
    rs[n]=buf;
    if(s(n+1)) return 1;
    buf=rs[i];
    rs[i]=rs[n];
    rs[n]=buf;
  }
  return 0;
}
int main(){
  int i;
  char buf[128],*ind,*h;
  while(fgets(buf,128,stdin)!=NULL){
    ind=strchr(buf,' ');
    *ind='\0';
    w=(double)atoi(buf);
    h=++ind;
    rsize=0;
    while((ind=strchr(ind,' '))!=NULL){
      *ind='\0';
      rs[rsize++]=atoi(h);
      h=++ind;
    }
    rs[rsize++]=atoi(h);
    printf("%s\n",s(0)?"OK":"NA");
  }
  return 0;
}