题意:

如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如1558,11,3,0都是上升数,而10,20170312则不是;

给定整数N,求最小的k使得N能被表示为k个上升数之和。

$1\leq N\leq 10^{500000}$

题解:

一个结论:每个上升数必定能被分解为九个全一数的和;

所谓“全一数”就是指1,1111,11111111这种每一位数都为1的数(包括0),证明显然。

设N可以被分解成K个全一数之和,显然答案$k=\lceil\frac{K}{9}\rceil$;

由于全一数不好处理,我们可以把一个长度为$l$的全一数变成$\frac{(10^{l+1}-1)}{9}$,那么有:

$N=\sum\limits_{i=1}^{K}\frac{(10^x)}{9}$(此处$x$代表不确定的位数)

$9N=\sum\limits_{i=1}^{K}(10^x-1)$

$9N+K=\sum\limits_{i=1}^{K}10^x$

这个式子是什么意思呢?如果不考虑进位,右边每一项都会使数位和+1,那么总体就说明$9N+K$的数位和等于$K$的数位和,此时$K$一定是9的倍数;

如果考虑进位,那么每进一位数位和就会减少9,因此$K$仍然要是9的倍数。

由于答案最多不会超过N的位数,枚举k,写个高精度乱做就行了。。。注意加法的时候没有进位就要break,这样是均摊$O(1)$的,否则是$O(n^2)$的。

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
int n,tot,a[];
char s[];
void mul(int a[],int &n,int k){
int p=;
tot=;
for(int i=;i<=n;i++){
p=a[i]*k+p;
a[i]=p%;
tot+=a[i];
p/=;
}
if(p)a[++n]=p;
tot+=p;
}
void add(int a[],int &n,int k){
int p=;
tot-=a[];
a[]+=k;
p=a[]/;
a[]%=;
tot+=a[];
for(int i=;i<=n;i++){
tot-=a[i];
a[i]+=p;
p=a[i]/;
a[i]%=;
tot+=a[i];
if(!p)break;
}
if(p)a[++n]=p;
tot+=p;
}
int main(){
scanf("%s",s);
n=strlen(s);
for(int i=;i<=n;i++){
a[i]=s[n-i]-'';
}
mul(a,n,);
for(int i=;i<=n;i++){
add(a,n,);
if(tot%==&&i*>=tot)return printf("%d",i),;
}
return ;
}

[agc011e]increasing numbers的更多相关文章

  1. [AGC011E] Increasing Numbers [数学]

    题面 传送门 思路 首先,我们观察一下上升数的性质 可以发现,它一定可以表示为最多9个全是1的数字的和 那么我们设$N$可以被表示成$k$个上升数的和,同时我们设$p_i=\underbrace{11 ...

  2. AGC011-E Increasing Numbers

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

  3. [agc011E]Increasing Numbers-[思考题]

    Description 传送门 Solution 依题得所有不下降数(设为a)可以拆为若干个全1数的和(如:1558=1111+111+111+111+111+1+1+1) 并且任意a所能拆出的全一数 ...

  4. 【AtCoder】AGC011 E - Increasing Numbers

    题解 题是真的好,我是真的不会做 智商本还是要多开啊QwQ 我们发现一个非下降的数字一定可以用不超过九个1111111111...1111表示 那么我们可以得到这样的一个式子,假如我们用了k个数,那么 ...

  5. AT2341 Increasing Numbers

    传送门 还是猜结论呢 然后我们就想我们可以每次去掉尽量多的位数来保证次数最小,假装这是对的,先写一发,A了 考虑如何去掉尽量多的位数,我们可以找到最大的几位的不下降序列,把最后一个-1,后面全部改成9 ...

  6. AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)

    题意: 当一个整数高位数字总不小于低位数字,或者说写成字符串之后单调不下降,称之为上升数.求一个整数最少能表示为多少个上升数的和.(n<=1e500000) 分析: 考虑那些不下降的数字,一定可 ...

  7. NOIp2018模拟赛四十

    今天太晚了...题解到时候补吧(flag立好) 成绩:100+0+0=100 感觉A题本质暴力贪心?C题一道水题我居然没做...亏爆 A:[agc011e]increasing numbers B:[ ...

  8. POJ 1239 Increasing Sequences 动态规划

    题目链接: http://poj.org/problem?id=1239 Increasing Sequences Time Limit: 1000MSMemory Limit: 10000K 问题描 ...

  9. TZOJ 5963 Increasing Sequences(线性DP)

    描述 Given a string of digits, insert commas to create a sequence of strictly increasing numbers so as ...

随机推荐

  1. SQL基本语句:1.模式 3.索引

    每次很长时间不用sql语句之后,都需要把基础的捡一捡,索性做个笔记,以后可以长看

  2. ZBrush中关于标记的特殊情况

    在ZBrush®中使用Marker标记调控板来记忆物体属性,因此能在任何时间回到标记并使用它给其他物体或改变物体作为参考点,在使用Marker标记调控板时回出现很多特殊情况,本文小编就这些特殊情况做一 ...

  3. css3背景渐变以及图片混合渲染模式(二)

    http://avnpc.com/pages/photoshop-layer-blending-algorithm http://www.html5cn.org/forum.php?mod=viewt ...

  4. 面试题sql

    查询书的价格10到20 之前显示10to20 没有显示unknown CREATE TABLE book(price INT,NAME VARCHAR(20)) SELECT NAME AS '名字' ...

  5. 路飞学城Python-Day39(第四模块复习题)

    并发编程 一.简答题 1,简述计算机操作系统的中断的作用 由于cpu本身一次只能执行一个程序,操作系统提供的中断机制使得cpu能够实现不断的在各个程序间进行切换,给人的感觉就是多个程序同时执行 为什么 ...

  6. git diff详解

    这篇文章很好很好 https://www.cnblogs.com/alfayed/p/4682780.html

  7. async-validator 的中文文档翻译

    阿里出品的 antd 和 ElementUI 组件库中表单校验默认使用的 async-validator,它在 gitbub 上也获得了 3.8k 的 star,可见这个库十分强大,奈何只有英文文档看 ...

  8. JS - 浅拷贝与深拷贝的理解以及简单实现方法

    前几天撸项目代码时, 由一个技术点间接牵扯出了这东西. 所以就来总结一下. 深拷贝 拷贝对象每个层级的属性. 作用的对象是 js中引用类型的对象,基本类型没有涉及. 本质上将引用类型的对象在堆上重新开 ...

  9. HDU 3117 Fibonacci Numbers( 矩阵快速幂 + 数学推导 )

    链接:传送门 题意:给一个 n ,输出 Fibonacci 数列第 n 项,如果第 n 项的位数 >= 8 位则按照 前4位 + ... + 后4位的格式输出 思路: n < 40时位数不 ...

  10. 51nod-字符串连接

    输入n个字符串s[i],你要把他们按某个顺序连接起来,使得字典序最小. (1 <= n <= 100) (每个字符串长度 <= 100) (字符串只包含小写字母) Input 第一行 ...