C++ ! 最大公约数 !(大数)

匿名 (未验证) 提交于 2019-12-02 23:55:01

题目描述
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数,用符号c(n,m)表示。
计算公式为:c(n,m)=n!/((n-m)!×m!)
现在你的任务是求出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。

解答要求
时间限制:5000ms, 内存限制:64MB
输入
输入只有一个整数n(1<n<=10000)。

输出
输出C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)的最大公约数。

样例
输入样例 1

3

输出样例 1

2

提示
范例中n=3,则C(2n,1),C(2n,3),C(2n,5),…,C(2n,2n-1)为6,20,6,则他们的最大公约数为2。

网上版本

 **网上的版本**  ```c /**   *  这道题直接按照组合的公式求解内存不够,所以需要利用辗转相减等价的思路求解。a,b的最大公约数,等价于a-b(a>b)与b的公约数  *  那么 C(2n,1),c(2n,3)...,c(2n,2n-1)的最大公约数 等价于 从c(2n,1)和c(2n,1)+c(2n,3)+..+c(2n,2n-1)(求和等于(2n)^(2n-1),奇偶项和相等,各等于总和的一半)的最大公约数  *  等价于 2n 和(2n)^(2n-1)的最大公约数,那么等价于n中最多有几个2(n最多有几个2问题,可以用n-n&(n-1)求取)  */ # include<iostream> using namespace std; int gcb(int n) { 	return n - (n & (n - 1));// 或者n & (-n) } int main() {  	int n; 	while (cin >> n) 	{ 		cout << gcb(n * 2) << ::endl; 	} 	return 0; } 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!