porblem 1001 ( hdu 5660 )
题意:
jrMz有两种角,第一种角都是正nnn边形的内角,第二种角都是正mmm边形的内角。jrMz想选出其中一些,某种角可以选多个或一个都不选,使得选出的所有角的度数之和恰好为360度。jrMz想知道这是否可能实现。
有多组测试数据,第一行一个整数(1≤T≤10),表示测试数据的组数。
对于每组测试数据,仅一行,两个整数n,m(3≤n,m≤100),之间有一个空格隔开。
可以实现则输出Yes,否则输出No。
题解:
很简单的题,只需要用数学公式求出两个正多边形的内角,在暴力枚举是否能构成360度即可,然而公式中有除法操作,是否需要考虑精度问题呢?我也不知道,反正数据范围之内的貌似不用(有人不考虑也过了),然而我还是重新改了一次代码,将等式左右化简为了不用除的方法,也过了。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,m,T;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int n1=m*(n-2);
int n2=n*(m-2);
int ans=2*m*n;
int sum=0;
int flag=0;
while(sum<=ans)
{
if((ans-sum)%n2==0)
{
flag=1;
break;
}
sum+=n1;
}
if (flag) printf("Yes\n");
else printf("No\n");
}
}
problem 1002 ( hdu 5661)
题意:
有四个正整数a,b,c,d,满足a≤b且c≤d。选择两个整数x,y,满足a≤x≤b且c≤y≤d,使得x XOR y的值最大,输出最大值。
题解:
这道题还是比较厉害,想出这种做法的人也是比较厉害,没有用什么恶心的搜索,ORZ,在此题中首先想到一定需要按位来做题,每次从高位到低位优先去取让x与y此位为不同的那种方法,然后再考虑这位上相同的做法,具体实现看代码。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
typedef long long LL;
LL a,b,c,d;
int T;
bool pan(LL x,LL y,int i)
{
LL mx=x+(1LL<<i)-1;//假设从此之后x的位上都取1
LL my=y+(1LL<<i)-1;//假设从此之后y的位上都取1
//此时mx,my分别是x与y在取当前位上取当前状态后,还能够构成的最大数
if (x>b || mx<a) return 0;//如果当前x超过范围,或者它还能构成的最大数还不能达到范围,那么此状态是错的
if (y>d || my<c) return 0;
return 1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
//cin>>a>>b>>c>>d;
scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d);
LL zz=0,yy=0;
for (int i=63;i>=0;i--)
{
//分别判断四种情况,注意优先判断位上不同的情况
if (pan(zz,yy+(1LL<<i),i))//x的i位上为0,y的i位上为1,判断
yy+=(1LL<<i);
else if (pan(zz+(1LL<<i),yy,i))
zz+=(1LL<<i);
else if (pan(zz+(1LL<<i),yy+(1LL<<i),i))
{
zz+=(1LL<<i);
yy+=(1LL<<i);
}
else continue;
}
printf("%I64d\n",zz^yy);
//cout<<(zz^yy)<<endl;
}
}