高精度练习

题目地址:http://acm.hust.edu.cn/vjudge/problem/30812

Xiao Ming‘s Hope

Description

Xiao Ming likes counting numbers very much, especially he is fond of counting odd numbers. Maybe he thinks it is the best way to show he is alone without a girl friend. The day 2011.11.11 comes. Seeing classmates walking with their girl friends, he coundn‘t help running into his classroom, and then opened his maths book preparing to count odd numbers. He looked at his book, then he found a question "C(n,0)+C (n,1)+C (n,2)+...+C (n,n)=?". Of course, Xiao Ming knew the answer, but he didn‘t care about that , What he wanted to know was that how many odd numbers there were? Then he began to count odd numbers. When n is equal to 1, C (1,0)=C (1,1)=1, there are 2 odd numbers. When n is equal to 2, C (2,0)=C (2,2)=1, there are 2 odd numbers...... Suddenly, he found a girl was watching him counting odd numbers. In order to show his gifts on maths, he wrote several big numbers what n would be equal to, but he found it was impossible to finished his tasks, then he sent a piece of information to you, and wanted you a excellent programmer to help him, he really didn‘t want to let her down. Can you help him?

Input

Each line contains a integer n(1<=n<=10 8)

Output

A single line with the number of odd numbers of C (n,0),C (n,1),C (n,2)...C (n,n).

Sample Input

1

2

11

Sample output

2

2

8

题目大意:C (n,0),C (n,1),C (n,2)...C (n,n).中有多少个奇数。

要求这些组合数中奇数的个数,那么也就是C(n,m)%2 == 1 的个数。首先,由Lucas定理可知C(n,m)%2 等于C(n%2,m%2)*(C(n/2,m/2)%2,而只有C(0,1) = 0 ,所以当n的某一二进制位为0时,m的必为0,那么考虑为n的二进制位为1的时候,m的二进制既可以为1也可以为0就能保证形成的数是奇数,所以最终结果是2^(n的二进制位中1的个数)。

#include <cstdio>
using namespace std;
int n;
int main(void)
{
    while (scanf("%d",&n) != EOF)
    {
        int cnt = 0;
        while(n)
        {
            if(n&1) cnt++;  //如果是奇数,cnt加1
            n >>= 1;        //相当于n /= 2
        }
        printf ( "%d\n" , 1<<cnt );//>>1为二进制有意义为,即除2, 1<<为左移一位,即乘2。
    }
    return 0;
}

时间: 2024-10-12 08:44:04

高精度练习的相关文章

hdu 5718 Oracle 高精度

Oracle Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description There is once a king and queen, rulers of an unnamed city, who have three daughters of conspicuous beauty. The youngest and most beautifu

问题 A: 【高精度】被限制的加法

问题 A: [高精度]被限制的加法 时间限制: 1 Sec  内存限制: 16 MB提交: 56  解决: 30[提交][状态][讨论版] 题目描述 据关押修罗王和邪狼监狱的典狱长吹嘘,该监狱自一千年前建成以来,尚未有一个囚犯能够成功地越狱.当然这应该要归功于对囚犯们严格的信息管制,例如囚犯们虽然可以自由地使用计算机,但计算机的内存被密码锁设置为仅有100KB大小,显然,在这小得可怜的内存上想编程进行任何大规模的魔法运算,几乎是不可能完成的任务.但修罗王信奉的格言是“一切皆有可能!”,为了破解掉

大数相乘-高精度乘法

一.算法简要描述 给定两个数,相乘如何得到高精度的结果,给定的两个数,不确定是不是浮点数,即可能一个数带多位小数,另一个带小数,或者两个数都带多位小数,或都不带小数,针对这些情况,程序应该都要考虑,所谓的高精度其实就是看两个数的小数位有多少,那么其结果的小数位数应该为两数小数位数之和. 二.算法思路 针对上述描述,其实大部分思路首先想到的应该是用字符串来表示这两个数,带小数点和不带小数点最终都可转换成类似于两个大整数相乘的情况,在最后考虑把小数点放到结果的合适位置即可 三.算法代码 /* two

如何构建高精度室内定位系统

高精度室内定位需要的技术 室内GIS展示 室内导航技术 高精度定位传感器 高精度定位算法 平面gis 的三维转换技术 6.  平台网络管理 这里的关键是高精度定位传感技术. 可定位的方式gps,北斗gps,蓝牙,空间定位算法

HDU 6206 Apple ( 高精度 &amp;&amp; 计算几何 &amp;&amp; 三点构圆求圆心半径 )

题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分析 : 简单的计算几何问题,如果能够知道圆心和半径(Radius)以及第四个点和圆心的距离(Distance),我们就能够判断第四个点是否在圆外,例如Distance > Radius则在圆外.三点构圆 的圆心和半径是能够推导出公式的 (参考==> http://blog.csdn.net/dea

codeforces gym 100357 H (DP 高精度)

题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选出了i张牌,数字从1~j,最后有k张牌是顺子.对于每个数字进行考虑,有0~s种选法.要保证连续c张牌的顺子. 对于组成同花的概率,令dp[i][j]表示一共选出了i张牌,颜色从1~j,.对于每种颜色进行考虑,有0~r种选法.要保证没有c张牌是相同颜色的. 最后用高精度来输出答案. 参考程序 1 #i

[bzoj1002][FJOI2007]轮状病毒-题解[基尔霍夫矩阵][高精度][递推]

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input

04-JAVA高精度数字

为了解决Java基本数据类型在运算时会出现的溢出和计算不精确的问题.Java 提供了两个类BigInteger和BigDecimal,专门用于进行高精度运算.凡是能用int 或float 做的事情,用BigInteger和BigDecimal也可以做,只是必须换用方法调用,而不是使用运算符.高精度整数BigInteger       BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值:同时在运算过程中不会丢失任何信息:高精度浮点数BigDecimal 它可以表示任意精

bzoj 2056: gift? 高精度?

2056: gift? 高精度? Time Limit: 10 Sec  Memory Limit: 1 MB Description Input 输入的第一行为一个整数t. 接下来t行,每行包含九个自然数. Output 输出t行 每行一个整数,表示2^a+2^b+2^c+2^d+2^e+2^f+2^g+2^h+i. Sample Input 1 21 30 0 0 0 0 0 0 2147483647 Sample Output 3223322629 HINT [数据规模]40% t<=10

[code3119]高精度练习之大整数开根

试题描述  给出一个正整数n,求n开根号后的整数部分的值.n的位数不超过1000位. 输入 读入一个不超过1000位的正整数n. 输出 输出所求答案 输入示例 17   输出示例 4 高精度开根:需要用的是手算开平方根的方法,我其实这个方法也不会,是临时到网上学习的 网上说的方法都挺详细的,我在这里就不详细说了,下面直接贴代码: 高精度模板需要用到高减高,高乘低,高加低. 1 #include<iostream> 2 #include<algorithm> 3 #include&l