就枚举四种情况,哪种能行就是yes了。很简单,关键是写法,我写的又丑又长。。。看了zhanyl的写法顿时心生敬佩。写的干净利落,简直美如画。。。这是功力的体现!
以下是zhanyl的写法,转载在此以供学习:
#include <vector> #include <list> #include <queue> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <cstring> #include <tr1/unordered_set> #include <tr1/unordered_map> using namespace std; using namespace tr1; const int g[4][2]={{1,1},{1,-1},{-1,1},{-1,-1}}; long long n,k,d[2],f[3]; int t; bool ans; int main(){ scanf("%d",&t); while(t--){ scanf("%I64d%I64d%I64d%I64d",&n,&k,&d[0],&d[1]); if(n%3){ puts("no"); continue; } n=n/3; ans=false; for(int i=0;i<4;i++) if((k-g[i][0]*d[0]-g[i][1]*d[1])%3==0){ f[1]=(k-g[i][0]*d[0]-g[i][1]*d[1])/3; f[0]=f[1]+g[i][0]*d[0]; f[2]=f[1]+g[i][1]*d[1]; if(f[0]>=0&&f[1]>=0&&f[2]>=0&&f[0]<=n&&f[1]<=n&&f[2]<=n)ans=true; } if(ans)puts("yes"); else puts("no"); } return 0; }