#include<iostream> #include<cstdio> #include<cstring> #include<queue> int vi[102][102][102]; using namespace std; struct Point{ int a,b,c,v; Point(int x,int y,int z,int vv){a=x,b=y,c=z,v=vv;} }; void pu(int &a,int &b,int c) { if(b==c) return ; if(a+b<=c) b+=a,a=0; else a-=c-b,b=c; } int Min=10000000; void bfs(int a,int b,int c) { int i,j,x,y,z; queue<Point> q; Point p(0,0,c,0); q.push(p); int s=c,n=a,m=b; while(!q.empty()) { p=q.front(); q.pop(); x=p.a,y=p.b,z=p.c; //cout<<x<<" "<<y<<" "<<z<<"* "<<p.v<<endl; if(x*2==s) { if(y*2==s||z*2==s) { if(p.v<Min) Min=p.v; } else { if(p.v+1<Min) Min=p.v+1; } } if(y*2==s) { if(x*2==s||z*2==s) { if(p.v<Min) Min=p.v; } else//cout<<x<<" "<<y<<" "<<" "<<s<<" "<<Min<<" "<<p.v+1<<endl; if(p.v+1<Min) { Min=p.v+1; } } if(z*2==s) { if(x*2==s||y*2==s) { if(p.v<Min) Min=p.v; } else { if(p.v+1<Min) Min=p.v+1; } } vi[x][y][z]=1; int t1,t2; t1=x,t2=y; pu(t1,t2,m); if(!vi[t1][t2][z]) q.push(Point(t1,t2,z,p.v+1)); t1=x,t2=z; pu(t1,t2,s); if(!vi[t1][y][t2]) q.push(Point(t1,y,t2,p.v+1)); t1=y,t2=x; pu(t1,t2,n); if(!vi[t2][t1][z]) q.push(Point(t2,t1,z,p.v+1)); t1=y,t2=z; pu(t1,t2,s); if(!vi[x][t1][t2]) q.push(Point(x,t1,t2,p.v+1)); t1=z,t2=x; pu(t1,t2,n); if(!vi[t2][y][t1]) q.push(Point(t2,y,t1,p.v+1)); t1=z,t2=y; pu(t1,t2,m); if(!vi[x][t2][t1]) q.push(Point(x,t2,t1,p.v+1)); } } int main() { int a,b,c; while(scanf("%d%d%d",&a,&b,&c),a||b||c) { if(a%2==1||a==0||b==0||c==0) { printf("NO "); continue; } memset(vi,0,sizeof(vi)); Min=100000000; bfs(b,c,a); if(Min==100000000) printf("NO "); else printf("%d ",Min); } return 0; }