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<math.h>
#include<string.h>
double f(int a,int b){return sqrt((a+b)*(a+b)-(a-b)*(a-b));}
int nxpt(char *s){
  int i,l=strlen(s),max=0,f[260]={0};
  for(l--;l+1&&max<=s[l];l--)f[max=s[l]]++;
  if(l<0)return 0;
  f[s[l]]++;
  for(i=s[l]+1;f[i]==0;i++);
  f[s[l]=i]--;
  for(i=0;s[++l];f[s[l]=i]--){
    while(f[i]==0)i++;
  }
  return 1;
}
int main(){
  char s[100010],a[20];
  int i,r,n[20],m;
  double d[30],l;
  while(fgets(s,100000,stdin)){
    for(i=r=m=0;s[i];i++){
      if('0'<=s[i]&&s[i]<='9')m=m*10+s[i]-'0';
      else{
	a[r]=r+1;
	n[r++]=m;
	m=0;
      }
    }
    a[r-1]=0;
    //for(i=0;i<r-1;i++)printf("%d\n",a[i]);
    do{//printf("\n");
      for(i=l=0;i+2<r;i++){//printf("%d %d\n",n[a[i]],n[a[i+1]]);
	d[i]=f(n[a[i]],n[a[i+1]]);
	l+=d[i];//printf("%f ",l);
      }//printf("%f ",l+n[1]+n[r-1]);
      if(l+n[a[0]]+n[a[r-2]]>n[0])goto END;
      for(i=0;i+3<r;i++){
	if(d[i]+d[i+1]<f(n[a[i]],n[a[i+2]]))goto END;
      }
      printf("OK\n");
      goto NEXT;
    END:;
    }while(nxpt(a));
    printf("NA\n");
  NEXT:;
  }
  return 0;
}