boolean sub(char[] t, int k, int ind){
		//割り当てが終わったら式の評価ができる
		if(ind==t.length){
			id = 0;
			s = exs.get(k).str[0];
			double ex1 = exp();
			if(ex1==1<<28)return false;
			id = 0;
			s = exs.get(k).str[1];
			double ex2 = exp();
			if(ex2==1<<28)return false;
			//両辺が等しいとき、次の等式の評価に進む
			if(Math.abs(ex1-ex2)<1e-6)return assign(k+1);
			//等しくなかったら割り当てのやり直し
			return false;
		}
		if(!Character.isUpperCase(t[ind]))return sub(t,k,ind+1);
		int x = t[ind]-'A';
		if(ref[x]!=-1)return sub(t,k,ind+1);
		for(int i=0;i<n;i++){
			if(u[i])continue;
			u[i] = true;
			ref[x] = i;
			if(sub(t,k,ind+1))return true;
			u[i] = false;
			ref[x] = -1;
		}
		return false;
	}