题目描述
YYH手上有一个长度为N的数列,而且这个数列正好能表示为。现在他想知道这个数列的最大公约数是多少,请你帮帮他
输入输出格式
输入格式:
每个数据点包括多组数据,以EOF结束
对于每个数据输入一行一个整数,N,为数列的长度
输出格式:
对于每个数据输出一行一个整数,为数列的最大公约数
这道题目就是结论题,因为题目数据太大,所以我们必须O(logN)做出答案。
我们看出来如果N是一个奇数,那么由于肯定会出现C(n,n)所以最大公因数为1.
否则如果n是一个偶数,我们很容易得出答案为2*lowbit(n)
然后就很水啦。
#include<iostream> #include<cstdio> using namespace std; long long n,ans=1; int main(){ while(~scanf("%lld",&n)) { ans=1; n=n*2; while(n%2==0){ n/=2; ans*=2; } printf("%lld ",ans); } }
记得开longlong哦