zoukankan      html  css  js  c++  java
  • 组合数末尾的零

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

    题意:

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

          C(mn) = m!/((n)!n!) 

          现在请问,如果将组合数C(mn)写成二进制数,请问转这个二进制数末尾有多少个零。

           案例:

          input:

          2

          4 2

          1000 500

          output:

          1

          6

    思路分析:

          因为n ≤ m≤1000,所以m!的结果过大会溢出,所以先得出组合数再化为二进制的方法是行不通的。因此需要逐个计算。

          进行简单归类后会发现,当某个数可以有多少个因子是2,它的二进制末尾就有多少个0;因此在循环计算组合时可以逐个求出可以有多少因子是2 。

          先将才组合数的计算公式化简,可得结果为n+1到m的乘积除以1到m-n的乘积,再对分母进行循环求出可以有多少因子是2,得出a,同时对分子也进行循环求出可以有多少因子是2,

          得出b,最后用分母的因字数减去分子的因字数,输出a-b。

    源代码如下:

         

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int m,n,a,T,j,i,b,k;
     6     cin>>T;
     7     for(i=0;i<T;i++)
     8     {
     9         a=0;b=0;
    10         cin>>m>>n;
    11         for(j=n+1;j<=m;j++)
    12         {
    13             k=j;
    14             while(k%2==0)
    15             {
    16                 k=k/2;
    17                 a++;
    18             }
    19         }
    20         for(j=1;j<=m-n;j++)
    21         {
    22             k=j;
    23             while(k%2==0)
    24             {
    25                 k=k/2;
    26                 b++;
    27             }
    28         }
    29         cout<<a-b<<endl;
    30     }
    31     return 0;
    32 }

        

  • 相关阅读:
    Python随笔-快排
    万恶的tileMap
    cocos2d-js引擎学习笔记
    【cocos2d-js 3.0】制作2048
    js构造函数的完美继承(欢迎吐槽)
    快速排序(js版本)
    javascript语言学习笔记。
    数据结构与算法
    A*寻路算法 (cocos2d-js详细代码)
    javascript单例模式(懒汉 饿汉)
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4653960.html
Copyright © 2011-2022 走看看