1021: 组合数末尾的零

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=30303

题目:

m个不同元素中取出n (n m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:

C(m, n) = m!/((m - n)!n!), 问:如果将组合数C(m, n)写成二进制数,这个二进制数末尾有多少个零?(其中n m≤ 1000)

案例:

Sample Input

            2
            4 2
            1000 500 

Sample Output

            1
            6 

题目分析:

首先将组合计算公式化简,得C(m,n)=(n+1)*(n+2)*...*m/(n-1)!,求取组合数化为二进制数末尾有几个0,若依次计算乘除,数据过于庞大。因为二进制为得2进1,可以考虑计算分子中有几个约数2(假设为k个),分母中又有几个约数2(假设为t个),则所求结果为(k-t)个。

源代码:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int T,m,n,j,k,t;
 6     cin>>T;//输入案例数
 7     for(int i=0;i<T;i++)
 8     {   k=0;
 9         cin>>m>>n;
10         for(j=n+1;j<=m;j++)
11         {  t=j;
12             while(t%2==0)
13            {     k++;//计算分子中约数2的个数
14                  t=t/2;
15            }
16         }
17         for(j=2;j<=m-n;j++)
18         {   t=j;
19             while(t%2==0)
20             {     k--;//减去分母中所含约数2的个数
21                   t=t/2;
22             }
23         }
24         cout<<k<<endl;
25     }
26     return 0;
27 }
时间: 2024-10-10 16:04:52

1021: 组合数末尾的零的相关文章

组合数末尾的零

组合数末尾的零 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 172(113 users) Total Accepted: 110(96 users) Rating: Special Judge: No Description 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数.组合数的计算公式如下: C(m, n) = m!/((m - n)!n!) 现在请问,如果将组合数C(

阶乘末尾的零个数

[编程题] 末尾0的个数 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 输入例子: 10 输出例子: 2方法:Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方) 1 import java.util.Scanner; 2 3 public class Test60 { 4 5 public s

javascript 去掉小数末尾多余的零

做的项目里需要去掉 小数末尾的零 就自己随手写了一个 var t = "10203000"; alert(cutZero(t)); /* 去掉double类型小数点后面多余的0 参数:old 要处理的字符串或double 返回值:newStr 没有多余零的小数或字符串 例: cutZero(123.000) -> 123 cutZero(123.0001) -> 123.0001 cutZero(10203000.0101000) -> 10203000.0101 c

N!中末尾有多少个0

问题:先从100!的末尾有多少零         =>    再推广到  任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一个整数若含有一个因子5则必然会在求100!时产生一个零,                               问题转化为:求1到100,这100个整数中包含了多少个因子5.                                若整数N能被25整除,则N包含2个因子5,若N能被5整除,则N

正则表达式基本语法应用详解

1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束.例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等): "of despair$":表示所以以"of despair"结尾的字符串: "^abc$":表示开始和结尾都是"abc"的字符串--呵呵,只有&qu

阶乘后面0的数量

题目描述: n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 每个数阶乘末尾的零是由前面阶乘数字中的因子2和因子5相乘而造成的,又因为5比2多,所以只需考虑5的个数.每隔5个数,会产生一个0,如5.10.15...:每隔25个数,会多产生一个0,即两个0,如25/50/75...:每隔125个数,会多产生一个0,即三个0,如125.625...等等.即每次将除以5后

正则表达式语法规则

一.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束.例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等):"of despair$":表示所以以"of despair"结尾的字符串:"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"

FFT与二维FFT的C#实现

傅里叶变换在信息处理应用中具有很实用的价值,而快速傅里叶变换,即FFT,是实用的计算算法. 本文介绍FFT和2维FFT的C#实现方法. 1. FFT编程依据 FFT是按照如图结构(也称蝶形结构)进行运算(图片来源于网络). 图中,箭头代表数据流向,箭头与箭头的合并点代表相加,箭头下面的常数代表相乘,WN(注:N为下标) = exp(-j * 2 * PI / N),j为虚数单位,DIT的输入(或DIF的输出)序列重排点y[m]与初始输入点x[n]的关系为:m与n互为倒位序(例:001 -- 10

SQL金额转大写

create function [dbo].[fn_getformatmoney] (@money numeric(14,2)) returns nvarchar(32) as begin declare @money_num nvarchar(20) --存储金额的字符形式 , @money_chn nvarchar(32) --存储金额的中文大写形式 , @n_chn nvarchar(1), @i int --临时变量 select @money_chn=case when @money>