• EOJ2014 Sum of digits


    链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=2014

    题目的大意是指有多少个k位数组满足和的各位数之和等于各位数之和的和
    本质上就是在求有多少个k位数组满足求和时不进位,首位不可以有0,所以第一位有36种可能,之后后都有55种可能,所以k位数共36*55^(k-1)组,这个用乘法定理就可以证明,而且这题的数据很大,所以只能用高精度的算法实现

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <string>
     6 #include <algorithm>
     7 using namespace std;
     8  
     9 string h[60];
    10  
    11 string add(string p, string q)
    12 {
    13     char s[100] = {0};
    14     string c;
    15     char a[100], b[100];
    16     strcpy(a, p.c_str());
    17     strcpy(b, q.c_str());
    18     int k = 0, l, m, n, x;
    19     int i = p.size();
    20     int j = q.size();
    21     m = i - 1;
    22     n = j - 1;
    23     while (k < i && k < j)
    24     {
    25         s[k] = a[m] - '0' + b[n] + s[k];
    26         m--;
    27         n--;
    28         if (s[k] > '9')
    29         {
    30             s[k] = s[k] - 10;
    31             s[k + 1]++;
    32         }
    33         k++;
    34     }
    35     if (k == i)
    36         for (k = i; k < j; k++)
    37         {
    38             s[k] = s[k] + b[n];
    39             n--;
    40             if (s[k] > '9')
    41             {
    42                 s[k] = s[k] - 10;
    43                 s[k + 1]++;
    44             }
    45         }
    46     else
    47         for (k = j; k < i; k++)
    48         {
    49             s[k] = s[k] + a[m];
    50             m--;
    51             if (s[k] > '9')
    52             {
    53                 s[k] = s[k] - 10;
    54                 s[k + 1]++;
    55             }
    56         }
    57     if (s[k])
    58         c += s[k] + '0';
    59     for (i = k - 1; i >= 0; i--)
    60         c += s[i];
    61     return c;
    62 }
    63  
    64 string tim(string a, string b)
    65 {
    66     int i = 0;
    67     string s;
    68     while (i < b.size())
    69     {
    70         s += '0';
    71         for (int j = 0; j < (b[i] - '0'); j++)
    72             s = add(s, a);
    73         i++;
    74     }
    75     return s;
    76 }
    77  
    78 int main()
    79 {
    80     h[1] = "36";
    81     for (int i = 2; i < 52; i++)
    82         h[i] = tim(h[i - 1], "55");
    83     int n;
    84     while (cin >> n)
    85     {
    86         cout << h[n] << endl;
    87     }
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    java学习之旅(一):BOS项目使用的技术以及开发环境
    spring手动回滚
    tomcat下配置多端口,多项目
    centos7安装Mysql5.6
    windows phone7 下 Silverlight 异步读取网络图片
    Sencha Touch 本地化存储配置
    LCD1602显示接收的串口通讯字串
    QML 怎么在gridview中用Index定位? 怎么在代理中设置背景?
    89C52定时/计数器
    QML JSON 展示
  • 原文地址:https://www.cnblogs.com/KimKyeYu/p/3128692.html
Copyright © 2020-2023  润新知