import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ // solution1(in); solution2(in); } } /** * 数学法: 分4种情况解方程组 * * 最终情况只能是每队得分: n/3 * s1: 球队1当前得分 s2: 球队2当前得分 s3: 球队3当前得分 * |s1-s2| = d1 * |s2-s3| = d2 * s1+s2+s3 = k * * @param in */ private static void solution1(Scanner in){ int lines = in.nextInt(); for(int i=1; i<=lines; i++){ long n = in.nextLong(); long k = in.nextLong(); long d1 = in.nextLong(); long d2 = in.nextLong(); // 比赛场数不为3的倍数 if(n%3 != 0){ System.out.println("no"); } // 比分差额大于n/3 else if(d1>n/3 || d2>n/3){ System.out.println("no"); }else if(check(n, k, d1, d2) || check(n, k, -d1, d2) || check(n, k, d1, -d2) || check(n, k, -d1, -d2)){ System.out.println("yes"); }else{ System.out.println("no"); } } } /** * check: 4种情况代码相同 通用简化 * * |s1-s2| = d1 * |s3-s2| = d2 * s1+s2+s3 = k * * @param n * @param k * @param d1 * @param d2 * @return */ private static boolean check(long n, long k, long d1, long d2){ if((k-d1-d2)%3 != 0){ return false; } long s2 = (k-d1-d2)/3; long s1 = s2+d1; long s3 = s2+d2; if((0<=s1&&s1<=n/3) && (0<=s2&&s2<=n/3) && (0<=s3&&s3<=n/3)){ return true; }else{ return false; } } /** * 数学法: 分4种情况解方程组 * * 最终情况只能是每队得分: n/3 * s1: 球队1当前得分 s2: 球队2当前得分 s3: 球队3当前得分 * |s1-s2| = d1 * |s2-s3| = d2 * s1+s2+s3 = k * * @param in */ private static void solution2(Scanner in){ int lines = in.nextInt(); for(int i=1; i<=lines; i++){ long n = in.nextLong(); long k = in.nextLong(); long d1 = in.nextLong(); long d2 = in.nextLong(); // 比赛场数不为3的倍数 if(n%3 != 0){ System.out.println("no"); } // 比分差额大于n/3 else if(d1>n/3 || d2>n/3){ System.out.println("no"); }else if(case1(n, k, d1, d2) || case2(n, k, d1, d2) || case3(n, k, d1, d2) || case4(n, k, d1, d2)){ System.out.println("yes"); }else{ System.out.println("no"); } } } /** * case1 * * s1-s2 = d1 * s3-s2 = d2 * s1+s2+s3 = k * * @param n * @param k * @param d1 * @param d2 * @return */ private static boolean case1(long n, long k, long d1, long d2){ if((k-d1-d2)%3 != 0){ return false; } long s2 = (k-d1-d2)/3; long s1 = s2+d1; long s3 = s2+d2; if((0<=s1&&s1<=n/3) && (0<=s2&&s2<=n/3) && (0<=s3&&s3<=n/3)){ return true; }else{ return false; } } /** * case2 * * s1-s2 = d1 * s2-s3 = d2 * s1+s2+s3 = k * * @param n * @param k * @param d1 * @param d2 * @return */ private static boolean case2(long n, long k, long d1, long d2){ if((k-d1+d2)%3 != 0){ return false; } long s2 = (k-d1+d2)/3; long s1 = s2+d1; long s3 = s2-d2; if((0<=s1&&s1<=n/3) && (0<=s2&&s2<=n/3) && (0<=s3&&s3<=n/3)){ return true; }else{ return false; } } /** * case3 * * s2-s1 = d1 * s3-s2 = d2 * s1+s2+s3 = k * * @param n * @param k * @param d1 * @param d2 * @return */ private static boolean case3(long n, long k, long d1, long d2){ if((k+d1-d2)%3 != 0){ return false; } long s2 = (k+d1-d2)/3; long s1 = s2-d1; long s3 = s2+d2; if((0<=s1&&s1<=n/3) && (0<=s2&&s2<=n/3) && (0<=s3&&s3<=n/3)){ return true; }else{ return false; } } /** * case4 * * s2-s1 = d1 * s2-s3 = d2 * s1+s2+s3 = k * * @param n * @param k * @param d1 * @param d2 * @return */ private static boolean case4(long n, long k, long d1, long d2){ if((k+d1+d2)%3 != 0){ return false; } long s2 = (k+d1+d2)/3; long s1 = s2-d1; long s3 = s2-d2; if((0<=s1&&s1<=n/3) && (0<=s2&&s2<=n/3) && (0<=s3&&s3<=n/3)){ return true; }else{ return false; } } }