【数学】8.30题解-count数页码
count
题目描述
一本书的页码是从 1-n 编号的连续整数: 1, 2, 3, ... , n。请你求出全部页码中
所有单个数字的和,例如第 123 页,它的和就是 1+2+3=6。
输入输出
输入
一行为 n(1 <= n <= 10^9)。
输出
一行,代表所有单个数字的和。
样例
样例输入
3456789
样例输出
96342015
说明
时间限制 1s/testcase
空间限制 32MB
思路
鉴于 n 可以达到 10^9,直接模拟是不可取的
逐位递推,发现规律.
- 对于10^7以内的数据,直接模拟暴力可以过
for(int i=1; i<=n; i++)
ans+=solve(i);
inline int solve(int x) {
int an=0;
while(x) {
an=an+x%10;
x/=10;
}
}
- 可以先用暴力算出n=1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9时的答案
- 对于大于1e7的数据我们可以逐位来算
举个较小的例子:7654
第一位:7 ;
(1) 则1~6一定都在第一位出现了1e3次;
(2) 7出现了654+1次
(3) 再加上7*ans(1e3时的答案)
(4) 然后去掉这一位,原本的第二位,变成了现在的第一位
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<ctime>
using namespace std;
typedef long long ll;
int n;
ll ans;
ll a[20];
inline int solve(int x) {
int an=0;
while(x) {
an=an+x%10;
x/=10;
}
return an;
}
int main() {
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d",&n);
if(n<=1e7) {
for(int i=1; i<=n; i++)
ans+=solve(i);
printf("%d",ans);
return 0;
}
a[1]=45;
a[2]=900;
a[3]=13500;
a[4]=180000;
a[5]=2250000;
a[6]=27000000;
a[7]=315000000;
a[8]=3600000000LL;
if(n<1e8) {
ll temp=1e7,pos=7;
while(pos) {
int k1=n/temp;
k1--;
ans+=(ll)temp*(ll)k1*(ll)(k1+1)/2;
ans+=(ll)(k1+1)*(ll)a[pos];
ans+=(ll)(k1+1)*(ll)(n%temp+1);
n%=temp;
temp/=10;
pos--;
}
ans+=(ll)n*(ll)(n+1)/2;
printf("%lld",ans);
return 0;
}
if(n<1e9) {
ll temp=1e8,pos=8;
while(pos) {
int k1=n/temp;
ans+=(ll)temp*(ll)k1*(ll)(k1-1)/2; //(1)
ans+=(ll)(k1)*(ll)a[pos]; //(3)
ans+=(ll)(k1)*(ll)(n%temp+1); //(2)
n%=temp; //(4)
temp/=10; //(4)
pos--; //(4)
}
ans+=(ll)n*(ll)(n+1)/2;
printf("%lld",ans);
return 0;
}
return 0;
}
【数学】8.30题解-count数页码的更多相关文章
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- P1836 【数页码_NOI导刊2011提高(04)】
P1836 数页码_NOI导刊2011提高(04) 题目描述 一本书的页码是从1—n编号的连续整数:1,2,3,…,n.请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6. ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- 【LSGDOJ 2015】数页码
题目描述 一本书的页码是从 1-n 编号的连续整数:1, 2, 3, ... , n.请你求出全部页码中所有单个数字的和,例如第 123 页,它的和就是 1+2+3=6. 输入 一行为 n(1 < ...
- 题解-[SDOI2014]数数
[SDOI2014]数数 这题的前置知识是AC自动机和dp,前置题目是 [JSOI2007]文本生成器,前置题目我写的题解 题解-[JSOI2007]文本生成器.我的讲解假设你做过上面那道题. 这题比 ...
- [LeetCode 题解]: Count and Say
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- [转载]数学【p1900】 自我数
题目描述-->p1900 自我数 本文转自@keambar 转载已经原作者同意 分析: 思路还是比较好给出的: 用类似筛选素数的方法筛选自我数. 但是要注意到题目限制的空间仅有4M,不够开10^ ...
- 洛谷【P839】【NOI导刊】——数页码
题面 一道找规律好题... 首先,我们肯定只能一位一位的统计答案,考虑从高位向低位统计,显然这样要方便的多. 对于第i位,我们统计从$a[i+1]*10^i+0$到$a[i+1]*10^i+a[i]* ...
- LeetCode(38)题解: Count and Say
https://leetcode.com/problems/count-and-say/ 题目: The count-and-say sequence is the sequence of integ ...
随机推荐
- c++通讯录管理系统
代码拷贝 #include<iostream> #include<string> #include<stdlib.h> #define MAX 1000 using ...
- Canal详细入门实战(使用总结)
Canal介绍 Canal简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在 ...
- OO随笔之追求完美的第三单元——初试JML
前言 这一章的JML比较简单,那么大家的关注点自然地移到了性能优化上.于是大家一股脑地去利用各种数据结构去做时间上的优化(当然很多人最后还是倒在了正确性上),故称追求完美的一单元.当然这也是得益于JM ...
- Java中NIO的简单介绍
NIO基本介绍 Java NIO(New IO) 也有人称之为Java non-blocking IO 是从Java1.4版本开始引入的一个新的IO API,可以代替标准的IO API.NIO与原来的 ...
- ElasticSearch7使用指导
目录结构: 一.es概述 二.es安装/head插件安装/kibana安装 三.es核心概念 四.IK分词器 五.RestFul操作 六.CRUD(增删改查) 七.Springboot集成es --- ...
- 如何安装多个jdk并方便切换系统jdk版本
如何安装多个jdk并方便切换系统jdk版本 前言 在安装myeclipse时,压缩包中附带1.8.0的jdk,顺便安装并配置环境变量后发现系统默认的jdk变为了1.8.0.随后发现eclipse只支持 ...
- [bug] docker:write /var/lib/docker/tmp/GetImageBlob613162680: no space left on device
原因 分区空间不够,无法安装镜像 参考 https://www.cnblogs.com/elizwy/p/7722898.html https://blog.csdn.net/TinyJian/art ...
- [笔记] 《c++ primer》书店程序 Chapter 1
书店程序是<c++ primer>中重要的实例,涉及大部分重要知识点,但代码分散阅读不便,下面按照章节顺序总结 Sales_item.h #ifndef SALESITEM_H // we ...
- Linux 操作系统(二)搜索文件命令find、locate、which、whereis、grep、wc
以下命令均已在 Kali Linux 下验证. 1.find 命令 --1-- find /usr/share -name test.lst //精准搜索,文件名需要与-name后的内容一模一样包括后 ...
- Linux_进程管理相关命令
一.进程管理命令 1.ps -- 进程查看命令 1️⃣:ps(process state)命令用于列出当前的进程 2️⃣:可以显示详细的进程信息,包括: 用户识别符(UID),它确定进程的特权 唯一进 ...