jrMz and angles
Accepts: 594
Submissions: 1198
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
大水体,直接试一下就行了。。。
官方解:
不妨令n≤m。
如果n>6,由于所有角都大于120度且小于180度,也就是说,两个角一定不够,而三个角一定过多。因此一定无解;
当n≤6时,如果n=3或n=4或n=6,那么显然只需要正n边形的角就可以了。如果n=5,则已经有一个108度的角。若这种角:不取,则显然仅当m=6时有解;取1个,则还差360−108=252(度),但是没有一个正m边形的内角的度数是252的约数;取2个,则还差360−108×2=144(度),这恰好是正10边形的内角,取3个,则还差360−108×3=36(度),也不可能满足;取大于3个也显然不可能。
因此得到结论:当n和m中至少有一个为3或4或6时,或者当n和m中一个等于5另一个等于10时,有解,否则无解,时间复杂度为
O(T)。
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<ctime> #define eps 1e-6 #define MAX 100005 #define INF 0x3f3f3f3f #define LL long long #define pii pair<string,int> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) const int dir[][2] = { {-1, 0}, {0, -1}, { 1, 0 }, { 0, 1 } }; using namespace std; int gcd (int a,int b){ int temp; while(a/b!=0){ temp=a; a=b; b=a%b; } return b; } int main() { int T; int a ,b; scanf("%d",&T); while(T--) { rd2(a,b); int mark=0; int zi1=(a-2)*b,zi2=(b-2)*a; int mu = a*b; for(int i=0;i<=10;i++) for(int j=0;j<=10;j++){ if((zi1*i+zi2*j)%(a*b)==0&&(zi1*i+zi2*j)/(a*b)==2) mark=1,i=10,j=10; //cout<<"ssssssssss"<<endl; } if(mark) printf("Yes "); else printf("No "); } return 0; }