• Digit sum (第 44 届 ACM/ICPC 亚洲区域赛(上海)网络赛)进制预处理水题


    •  131072K
     

    A digit sum S_b(n)Sb(n) is a sum of the base-bb digits of nn. Such as S_{10}(233) = 2 + 3 + 3 = 8   S10(233)=2+3+3=8, S_{2}(8)=1 + 0 + 0 = 1S2(8)=1+0+0=1, S_{2}(7)=1 + 1 + 1 = 3S2(7)=1+1+1=3.

    Given NN and bb, you need to calculate sum_{n=1}^{N} S_b(n)n=1NSb(n).

    InputFile

    The first line of the input gives the number of test cases, TT. TT test cases follow. Each test case starts with a line containing two integers NN and bb.

    1 leq T leq 1000001T100000

    1 leq N leq 10^61N106

    2 leq b leq 102b10

    OutputFile

    For each test case, output one line containing Case #x: y, where xx is the test case number (starting from 11) and yyis answer.

    样例输入

    2
    10 10
    8 2
    

    样例输出

    Case #1: 46
    Case #2: 13
      地址:https://nanti.jisuanke.com/t/41422
      题意为:给出
          t
          N b
          b为进制,求Sb(n)的加和,n从1~N 。比如样例2:S2(1~8),为S2(1)+S2(2)+...===1的二进制+2的二进制+3的二进制.....+8的二进制。而对于转化出的进制,由题意,S_{10}(233) = 2 + 3 + 3 = 8
        S2(8)=1+0+0=1。以此为规则。
          暴力会超时,所以需要先进行预处理。这是一个累加,所以建立二维数组,i表示进制数:
              1 2 3 4 5
     i:    1
          2
          3
          .
          .
          .
          .
          10
        由于1的2~10进制均为1,所以有:
          
        for(int i=1;i<=10;i++)
        {
            a[i][1]=1;
        }

          然后在j中,2=1+2,3=1+2+3,就是个累加,得到方程a[i][j]=a[i][j-1]+ac(j,i);ac里获取,i进制的j的各个位数相加。

        

        for(int i=2;i<=10;i++)
        {
            for(int j=2;j<=maxn;j++)
            {
                a[i][j]=a[i][j-1]+ac(j,i);
            }
        }
    总的代码为::
        
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm> 
    const int maxn=1e6+10; 
    using namespace std;
    typedef long long ll;
    ll a[11][maxn];
    int ac(ll n,ll b)
    {
        ll sum=0;
        while(n)
        {
            sum+=n%b;
            n=n/b;
        }
        return sum;
    }
    int main()
    {
        for(int i=1;i<=10;i++)
        {
            a[i][1]=1;
        }
        for(int i=2;i<=10;i++)
        {
            for(int j=2;j<=maxn;j++)
            {
                a[i][j]=a[i][j-1]+ac(j,i);
            }
        }
        ll t;
        scanf("%lld",&t);
        int ak=1;
        while(t--)
        {
            ll n,b;
            scanf("%lld%lld",&n,&b);
            printf("Case #%d: %lld
    ",ak++,a[b][n]);
        }
    }    

          over!

  • 相关阅读:
    206. Reverse Linked List
    简介AngularJS中使用factory和service的方法
    如何写一手漂亮的模型:面向对象编程的设计原则综述
    webpack入门操作教程
    webpack4.0.1安装问题和webpack.config.js的配置变化
    webpack.config.js配置遇到Error: Cannot find module '@babel/core'&&Cannot find module '@babel/plugin-transform-react-jsx' 问题
    解决webpack打包报错: Cannot find module '@webassemblyjs/wasm-parser'
    docker-compose介绍
    .NET Core+MySql+Nginx 容器化部署
    .net core使用ef core操作mysql数据库
  • 原文地址:https://www.cnblogs.com/liyexin/p/11529714.html
Copyright © 2020-2023  润新知