题面

传送门

思路

首先,我们观察一下上升数的性质

可以发现,它一定可以表示为最多9个全是1的数字的和

那么我们设$N$可以被表示成$k$个上升数的和,同时我们设$p_i=\underbrace{111\cdots 11}_{i}$

我们令$a_{i,j}$表示构成$N$的第$I$个上升数的第$j$个全1数的位数

那么可以写出这样的式子

$N=\sum_{i=1}k\sum_{j=1}9 p_{a[i][j]}$

我们发现,$p_{i,j}$这样子摆在这里非常不好操作,那么我们继续观察$p_i$的性质,发现:

$p_i=\frac{10^i - 1}{9}$

所以上式可以写成:

$N=\sum_{i=1}k\sum_{j=1}9 \frac{10^{a[i][j]}-1}{9}$

我们把9乘过去,再把右边的$9k$个1加过去,得到:

$9N+9k=\sum_{i=1}k\sum_{j=1}910^{a[i][j]}$

我们发现:右边这个东西,如果在所有的10的幂加起来的过程中,能够不进位的话,那么它的数位和一定是9k

如果它发生了进位,因为1次进位一定是-10+1,总数位和-9,而9k是9的倍数,所以这个东西的数位和一定是一个小于9k的9的倍数

再看左边,我们发现,实际上我们需要满足的就是$9N+9k$的数位和小于9k且是9的倍数,而$9N+9k$一定是9的倍数

所以我们只需要求出最小的$k$,使得$9N+9k$的数位和小于等于$9k$即可

由数学归纳法不难证明,本题中$k\leq len(N)$,所以我们只需要枚举$k=1\cdots 5e5$,只要维护一个高精度+即可,复杂度是担此操作均摊$O(1)$,总复杂度$O(n)$

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[1000010];int a[1000010];
int main(){
scanf("%s",s);int n=strlen(s),i,j,sum=0,k;
for(i=1;i<=n;i++) a[i]=(s[n-i]-'0')*9;
for(i=1;i<=n;i++){
a[i+1]+=a[i]/10;a[i]%=10;
}
if(a[n+1]) n++;
for(i=1;i<=n;i++) sum+=a[i];
for(k=1;k<=n*10;k++){
a[1]+=9;sum+=9;
j=1;
while(j<=n){
if(a[j]<10) break;
sum-=10;a[j]-=10;
sum++;a[j+1]++;
j++;
if(j==n&&a[j+1]) n++;//别忘了有可能加一位
}
if(sum<=9*k){//注意这里一定不要写成等于了
printf("%d\n",k);return 0;
}
}
}

[AGC011E] Increasing Numbers [数学]的更多相关文章

  1. [agc011e]increasing numbers

    题意: 如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如1558,11,3,0都是上升数,而10,20170312则不是: 给定整数N,求最小的k使得N能被表示为k个上 ...

  2. AGC011-E Increasing Numbers

    题意 给定一个数\(n\),\(n≤10^{500,000}\),问\(n\)最少可以拆分成几个不降数的和.一个不降数是在十进制位下,从高位往低位看,每个数都不会比高位的数更小的数 做法 不降数可以拆 ...

  3. UVA 11582 Colossal Fibonacci Numbers(数学)

    Colossal Fibonacci Numbers 想先说下最近的状态吧,已经考完试了,这个暑假也应该是最后刷题的暑假了,打完今年acm就应该会退了,但是还什么都不会呢? +_+ 所以这个暑假,一定 ...

  4. POJ 3252 Round Numbers 数学题解

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  5. HDU 6659 Acesrc and Good Numbers (数学 思维)

    2019 杭电多校 8 1003 题目链接:HDU 6659 比赛链接:2019 Multi-University Training Contest 8 Problem Description Ace ...

  6. UVA 11481 - Arrange the Numbers 数学

    Consider this sequence {1, 2, 3, . . . , N}, as a initial sequence of first N natural numbers. You ca ...

  7. POJ2402/UVA 12050 Palindrome Numbers 数学思维

    A palindrome is a word, number, or phrase that reads the same forwards as backwards. For example,the ...

  8. CF385C Bear and Prime Numbers 数学

    题意翻译 给你一串数列a.对于一个质数p,定义函数f(p)=a数列中能被p整除的数的个数.给出m组询问l,r,询问[l,r]区间内所有素数p的f(p)之和. 题目描述 Recently, the be ...

  9. SGU 169 numbers 数学

    169.Numbers Let us call P(n) - the product of all digits of number n (in decimal notation). For exam ...

随机推荐

  1. Javascript简单特效及摘要

    1.js中的Element对象 ** var input1=docuemnt.getElementById("input1"); //alert(input1.value); // ...

  2. 课时16.HTML-XHTML-HTML5区别(了解)

    简而言之 HTML语法非常宽松容错性强: XHTML更为严格,它要求标签必须小写,必须严格闭合,标签中的属性必须使用引号引起等等. HTML5是HTML的下一个版本所以除了非常宽松容错性强以外,还增加 ...

  3. python__系统 : socket_UDP相关

    socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...

  4. js 判断function是否存在

    function myFunction(){ }//方法一 if(typeof(myFunction) == 'function'){ //function }else{ //undefined }/ ...

  5. Social Media Addiction【社交媒体上瘾】

    Social Media Addiction Children as young as ten are becoming dependent on social media for their sen ...

  6. C语言基础篇(三) 指针

    导航: 1.指针     2. 数组     3. 结构体,共用体     4. 内存分布图     5. 段错误分析 ----->x<------------->x<---- ...

  7. 【转】正则表达式速查表(http://www.jb51.net/shouce/jquery1.82/regexp.html)

    正则表达式速查表 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,“n”匹配字符“n”.“\n”匹配一个换行符.串行“\\”匹配“\”而“\( ...

  8. java 值传递 和 引用传递

    参考:(http://www.cnblogs.com/woshimrf/p/5263018.html) 参考:(http://www.cnblogs.com/binyue/p/3862276.html ...

  9. centos 6.X 关闭selinux

    SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.在这种访问控制体系的限制下,进程只能访问那 ...

  10. DOS程序员手册(七)

    第11章      中断处理程序 本章将深入到DOS系统内部探讨中断处理程序的内容.与其他计算机编程不一样, 中断处理程序这个名词听起来就很难懂.用最简单的话来说,中断处理程序就是对应于中 断激活的程 ...