zoukankan      html  css  js  c++  java
  • 【LSGDOJ 2015】数页码

    题目描述

    一本书的页码是从 1-n 编号的连续整数:1, 2, 3, ... , n。请你求出全部页码中所有单个数字的和,例如第 123 页,它的和就是 1+2+3=6。

    输入

    一行为 n(1 <= n <= 10^9)。

    输出

    一行,代表所有单个数字的和。

    样例输入

    3456789

    样例输出

    96342015
     
    题解:
    世上最作死写法:
    把输入的n拆成k位,考虑每一位对答案的贡献,设f[i]为 1-(pow(10,i)-1)的每一个数字对答案的贡献
    可以预处理出来f[i]=f[i-1]*10+pow(10,i-1)*f[1];
    然后sum[i]为输入n的后i位的数(如样例sum[1]=9,sum[2]=89,sum[3]=789),   a[i]为输入的n的从后往前数第i位
    qw[i]为1-9的前缀和
    然后分析样例3456789,先算3000000以内的=3*f[6] 然后考虑3出现的次数=(sum[6]+1) 还有3000000之前的2000000和1000000中的2和1的贡献为qw[a[i]-1]*pow(10,6)
    然后考虑>3000000 的部分 456789的贡献,做同样的处理,于是作死的我写成递归形式.. 
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long ll;
     8 ll f[15],sum[15],a[15],qw[15];
     9 ll dfs(int x)
    10 {
    11     if(x==1)return qw[a[x]];
    12     ll tmp=0;
    13     if(a[x]!=0)tmp=qw[a[x]-1]*pow(10,x-1);
    14     return f[x-1]*a[x]+a[x]*(sum[x-1]+1)+tmp+dfs(x-1);
    15 }
    16 int main()
    17 {
    18     ll n;
    19     cin>>n;
    20     for(int i=1;i<=9;i++)f[1]+=i,qw[i]=qw[i-1]+i;
    21     for(int i=2;i<=9;i++)
    22     {
    23         f[i]=f[i-1]*10+pow(10,i-1)*f[1];
    24     }
    25     ll tmp=n;int m=0,x;
    26     while(tmp)
    27     {
    28         x=tmp%10;
    29         m++;
    30         a[m]=x;
    31         sum[m]=sum[m-1]+pow(10,m-1)*x;
    32         tmp/=10;
    33     }
    34     printf("%lld",dfs(m));
    35     return 0;
    36 }
  • 相关阅读:
    CodeForces 734F Anton and School
    CodeForces 733F Drivers Dissatisfaction
    CodeForces 733C Epidemic in Monstropolis
    ZOJ 3498 Javabeans
    ZOJ 3497 Mistwald
    ZOJ 3495 Lego Bricks
    CodeForces 732F Tourist Reform
    CodeForces 732E Sockets
    CodeForces 731E Funny Game
    CodeForces 731D 80-th Level Archeology
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7048149.html
Copyright © 2011-2022 走看看