• 组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数


    //  [3/17/2015 JmingS]
    /*
    此题可直接推导出公式:
    	{(A1+A2+……+An)!} / {A1!A2!……An!}

    由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』,
    大数实现的主要思想模拟手算,具体参考程序。
     
    */
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 const int MAX = 800;
     7 
     8 int n, arr[30];
     9 int total;
    10 int Ans[MAX], len;
    11 
    12 // 阶乘
    13 void Factorial(int _n, int _arr[], int &_len) {
    14     for (int num = 2; num <= _n; ++num) {
    15         int cnt = 0, val, carry = 0;
    16         for (; cnt < _len; ++cnt) {
    17             val = _arr[cnt] * num + carry;
    18             _arr[cnt] = val % 10;
    19             carry = val / 10;
    20         }
    21         while (carry) {
    22             _arr[_len++] = carry % 10;
    23             carry /= 10;
    24         }
    25     }
    26 }
    27 
    28 // 大数除法
    29 void Div(int data) {
    30     int carry = 0;
    31     int val;
    32     for (int i = len - 1; i >= 0; --i) {
    33         val = Ans[i] + carry * 10;
    34         Ans[i] = val / data;
    35         carry = val%data;
    36     }
    37     while (0 == Ans[len - 1]) {
    38         --len;
    39     }
    40 }
    41 
    42 void Solve() {
    43     for (int i = 0; i < n; ++i) {
    44         for (int j = 2; j <= arr[i]; ++j) {
    45             Div(j);
    46         }
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     //freopen("input.txt", "r", stdin);
    53     //freopen("output.txt", "w", stdout);
    54     while (~scanf("%d", &n) && n) {
    55         total = 0;
    56         for (int i = 0; i < n; ++i) {
    57             scanf("%d", &arr[i]);
    58             total += arr[i];
    59         }
    60         Ans[0] = 1;
    61         len = 1;
    62         Factorial(total, Ans, len);
    63         Solve();
    64         for (int i = len - 1; i >= 0; --i) {
    65             printf("%d", Ans[i]);
    66         }
    67         printf("
    ");
    68     }
    69     return 0;
    70 }
    
    
    


  • 相关阅读:
    python把汉字转换成拼音实现程序
    C#第三方zip解压压缩工具,带事例源码
    实现在线压缩文件的实现程序代码
    如何处理JSON中的特殊字符
    《汉字简体、繁体相互转换》 查看源代码
    中文字符转拼音源码
    upper_bound()函数使用方法
    CodeFroces New Assignment 二分图匹配
    选拔赛 hash 字符串匹配 哈希算法(白书p374)
    lower_bound()函数使用
  • 原文地址:https://www.cnblogs.com/shijianming/p/4346063.html
Copyright © 2020-2023  润新知