2795 - Angle
时间限制 : 1 秒
内存限制 : 128 MB
小M可以通过直尺和圆规直接画出N种角度,并且她可以将任意两个她画出的角度相加或者相减。现在给出K个角度,问小M能否画出它们。
<br />
题目输入
输入共三行。
第一行为2个整数N,K(1<=N,K<=10),分别表示小M能直接画出的角度的个数和询问的个数。
第二行为N个小于360的正整数, 表示小M能直接画出的角度。
第三行为K个小于360的正整数,询问小M是否能画出它们。
题目输出
输出K行,每行回答小M能否画出相应的角度,“YES”表示能,“NO”表示不能。
输入/输出样例
输入格式
2 1 30 70 40
输出格式
YES
C++解答
#include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int n,k,ans=0,x; int a[11]={0}; bool b[361]={0}; bool flag=false; void sou(int du) { if(du==x) { flag=true; return; } else if(!flag) { for(int i=1;i<=n;i++) { int tmp=(du+a[i])%360; if(!b[tmp]) { b[tmp]=true; sou(tmp); } } for(int i=1;i<=n;i++) { int tmp=(du+(360-a[i]))%360; if(!b[tmp]) { b[tmp]=true; sou(tmp); } } } } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=k;i++) { memset(b,0,sizeof(b)); flag=false; scanf("%d",&x); sou(0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }