时空限制
CPU占用时长: 1.00秒
内存使用限制: 128MB
题目描述
农场主约翰喜爱对称的事物,眼下他准备把他牧场里的牛放置到N×M (1≤N≤1,000,000,0001≤N≤1,000,000,000; 1≤N≤1,000,000,0001≤M≤1,000,000,000)的格子里。为了保持对称性,他用下面的方法放置牛。先放一只牛到牧场的中心格子,如果没有这样的中心格子,他就停止他放置的工作。然后他将牧场分割成四个相同大小的区域(这四个区域被正中心的那只牛所在的行和列所分隔),并将牛用上面的方法安排到四个区域中。他不断地重复着他的分割直到没有中心方格存在或者牧场不能再被细分为止。看下面的例子,如果 M=7N=7,N=15M=15,那么约翰将在第 44 行,第 88 列放置一头牛并且将牧场分割成四个 3×73×7 的区域。在每一个 3×73×7 的区域的第 22 行,第 44 列放置一头牛,并且再将每个区域分割成四个 1∗31∗3 的区域。放置的过程如下所示(C代表一只牛):
这道题看起来很复杂,但是实际上并没有那么难。第一眼看到这道题想必所有人和我一样头疼。
我们先来看题,他说每一次都会沿着中心点分成四个部分,也就是说如果剩下的是奇数,就代表不可以再分下去了。然后我们再看,因为是四等分所以每个区域都完全一样,而分到不能在分之后就在这个区域中只有一头牛,我们再反过来*4+1就可以了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long Sy(long long a,long long b)
{
if(a%2==0||b%2==0)
{
return 0;
}
if(a<1||b<1)//多加两个终止条件以防万一
{
return 0;
}
if(a==1||b==1)//多加两个终止条件以防万一
{
return 1;
}
return Sy((a-1)/2,(b-1)/2)*4+1;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<Sy(a,b);
return 0;
}
这样也可以,本质是一样的
#include <bits/stdc++.h>
using namespace std;
long long d(long long x,long long y){
if((x/2)%2==0||(y/2)%2==0)return 1;
else return 4*d(x/2,y/2)+1;
}
int main(){
long long x,y;
cin>>x>>y;
if(x%2==0||x%2==0){
cout<<0;
return 0;
}
cout<<d(x,y);
return 0;
}
点个赞再走吧(欢迎评论,评论啥都行)
本人也在学c++的路途当中,不喜勿喷。(第一次做,给点建议)