YYH算组合数(NOIP模拟赛Round 6)

题目描述

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\n",ans);
    }
}

记得开longlong哦

posted @ 2017-06-01 16:58  ghostfly233  阅读(143)  评论(0编辑  收藏  举报