zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    [Java][Android][Process] 分享 Process 运行命令行封装类型
    UVA 11992
    2014扬声器的信息中国建筑师大会
    POJ 1745 Divisibility (线性dp)
    ListView 实现多选/无线电
    UVa 11587
    zoj 2156
    [TroubleShooting] The server network address can not be reached or does not exist
    oracle,如何查看视图结构,获得视图中的字段名称、字段类型、字段长度等。
    实现文件上传,以及表单提交成功的回调函数
  • 原文地址:https://www.cnblogs.com/liyexin/p/11529714.html
Copyright © 2011-2022 走看看