CF 451 C Predict Outcome of the Game(数学题)

来源:互联网 发布:萧山中学网络课程 编辑:程序博客网 时间:2024/06/05 00:25
C. Predict Outcome of the Game
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

There are n games in a football tournament. Three teams are participating in it. Currently k games had already been played.

You are an avid football fan, but recently you missed the whole k games. Fortunately, you remember a guess of your friend for these kgames. Your friend did not tell exact number of wins of each team, instead he thought that absolute difference between number of wins of first and second team will be d1 and that of between second and third team will be d2.

You don't want any of team win the tournament, that is each team should have the same number of wins after n games. That's why you want to know: does there exist a valid tournament satisfying the friend's guess such that no team will win this tournament?

Note that outcome of a match can not be a draw, it has to be either win or loss.

Input

The first line of the input contains a single integer corresponding to number of test cases t (1 ≤ t ≤ 105).

Each of the next t lines will contain four space-separated integers n, k, d1, d2 (1 ≤ n ≤ 1012; 0 ≤ k ≤ n; 0 ≤ d1, d2 ≤ k) — data for the current test case.

Output

For each test case, output a single line containing either "yes" if it is possible to have no winner of tournament, or "no" otherwise (without quotes).

Sample test(s)
input
53 0 0 03 3 0 06 4 1 06 3 3 03 3 3 2
output
yesyesyesnono
Note

Sample 1. There has not been any match up to now (k = 0, d1 = 0, d2 = 0). If there will be three matches (1-2, 2-3, 3-1) and each team wins once, then at the end each team will have 1 win.

Sample 2. You missed all the games (k = 3). As d1 = 0 and d2 = 0, and there is a way to play three games with no winner of tournament (described in the previous sample), the answer is "yes".

Sample 3. You missed 4 matches, and d1 = 1, d2 = 0. These four matches can be: 1-2 (win 2), 1-3 (win 3), 1-2 (win 1), 1-3 (win 1). Currently the first team has 2 wins, the second team has 1 win, the third team has 1 win. Two remaining matches can be: 1-2 (win 2), 1-3 (win 3). In the end all the teams have equal number of wins (2 wins).


首先,如果n%3 != 0,肯定不会使得三个队伍平手,输出“no”。

设三个队在前K场比赛中分别赢了x1,x2,x3场,有|x1 - x2| = d1, | x2 - x3| = d2。由于d1,d2分别有正负,那么共分为四种情况:{x1 - x2 = d1, x2 - x3 = d2},{x1 - x2 = d1, x3 - x2 = d2},{x2 - x1 = d1, x2 - x3 = d2},{x2 - x1 = d1,x3 - x2 = d2}。我们分别解出这四个方程中的符合题意的解,若要使最后三个队赢的次数相同,只要x1 <= n/3 && x2 <= n/3 && x3 <= n/3即可,前提是它们都大于等于0。

#include <stdio.h>#include <iostream>#include <map>#include <set>#include <stack>#include <vector>#include <math.h>#include <string.h>#include <queue>#include <string>#include <stdlib.h>#include <algorithm>#define LL __int64//#define _LL __int64#define eps 1e-12#define PI acos(-1.0)using namespace std;int main(){    int test;    LL n,k,d1,d2;    LL x1,x2,x3;    scanf("%d",&test);    while(test--)    {        scanf("%I64d %I64d %I64d %I64d",&n,&k,&d1,&d2);        if(n%3 != 0)        {            printf("no\n");            continue;        }        int flag = 0;        for(int i = 0; i <= 3; i++)        {            if(i == 0)            {                if( (k+d2+2*d1) >= 0 && (k+d2+2*d1)%3 == 0)                {                    x1 = (k+d2+2*d1)/3;                    x2 = x1 - d1;                    x3 = x2 - d2;                }                else continue;            }            else if(i == 1)            {                if( (k-d2+2*d1) >= 0 && (k-d2+2*d1)%3 == 0)                {                    x1 = (k-d2+2*d1)/3;                    x2 = x1 - d1;                    x3 = x2 + d2;                }                else continue;            }            else if(i == 2)            {                if( (k+d2-2*d1) >= 0 && (k+d2-2*d1)%3 == 0)                {                    x1 = (k+d2-2*d1)/3;                    x2 = x1 + d1;                    x3 = x2 - d2;                }                else continue;            }            else if(i == 3)            {                if( (k-d2-2*d1) >= 0 && (k-d2-2*d1)%3 == 0)                {                    x1 = (k-d2-2*d1)/3;                    x2 = x1 + d1;                    x3 = x2 + d2;                }                else continue;            }if(x1 >= 0 && x2 >= 0 && x3 >= 0 && x1 <= n/3 && x2 <= n/3 && x3 <= n/3){flag = 1;}        }if(flag == 1)printf("yes\n");elseprintf("no\n");    }    return 0;}



0 0
原创粉丝点击