[AGC011E] Increasing Numbers [数学]

题面

传送门

思路

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

可以发现,它一定可以表示为最多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;
        }
    }
}

原文地址:https://www.cnblogs.com/dedicatus545/p/9715288.html

时间: 2024-08-02 11:23:42

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

[agc011e]increasing numbers

题意: 如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如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}

AGC011-E Increasing Numbers

题意 给定一个数\(n\),\(n≤10^{500,000}\),问\(n\)最少可以拆分成几个不降数的和.一个不降数是在十进制位下,从高位往低位看,每个数都不会比高位的数更小的数 做法 不降数可以拆成若干个形似\(1111...111\)的数相加 位数为\(l\)的全\(1\)数可以写成\(\dfrac{10^{l+1}-1}{9}\) \(N=\sum\limits_{i=1}^k \dfrac{10^{a_i}-1}{9}\) 通过手玩可以进一步发现充分条件:\(9|k\) 写成\(N+9

POJ 3252 Round Numbers 数学题解

Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets

UVA 11481 - Arrange the Numbers 数学

Consider this sequence {1, 2, 3, . . . , N}, as a initial sequence of ?rst N natural numbers. You canearrange this sequence in many ways. There will be N! di?erent arrangements. You have to calculatethe number of arrangement of ?rst N natural numbers

POJ2402/UVA 12050 Palindrome Numbers 数学思维

A palindrome is a word, number, or phrase that reads the same forwards as backwards. For example,the name “anna” is a palindrome. Numbers can also be palindromes (e.g. 151 or 753357). Additionallynumbers can of course be ordered in size. The ?rst few

UVA 11582 Colossal Fibonacci Numbers! 数学

n比较小,最多n*n就回出现循环节.... Colossal Fibonacci Numbers! Time Limit: 1000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem F: Colossal Fibonacci Numbers! The i'th Fibonacci number f (i) is recursively defined in the

SGU 169 numbers 数学

169.Numbers Let us call P(n) - the product of all digits of number n (in decimal notation). For example, P(1243)=1*2*4*3=24; P(198501243)=0. Let us call n to be a good number, if (p(n)<>0) and (n mod P(n)=0). Let us call n to be a perfect number, if

poj 3252 Round Numbers(数学)

链接:http://poj.org/problem?id=3252 题意:一个数写成二进制,0不少于1就是round number,求给定区间内round number的个数. 分析:显然第一步转化为0到n的round number个数..设n写成二进制有len位,第一位取0时,后面只要满足0的个数要求就行了,不用考虑是否比n大..可以先预处理一下长度不大于len的round number个数,记做t[len],t[len]=t[len-1]+∑C(len-1  k) , (k=0,1,...,

HDU 3117 Fibonacci Numbers 数学

http://acm.hdu.edu.cn/showproblem.php?pid=3117 fib是有一个数学公式的. 这里的是标准的fib公式 那么fib = 1 / sqrt(5) * ((1 + sqrt(5) / 2) ^ n - ((1 - sqrt(5)) / 2)^n) = 1 / sqrt(5) * (A^n - B^n) 那么,求后4位可以直接矩阵快速幂. 不能用上面公式的快速幂取模,因为存在精度误差. 然后求前4位的话,就是一个套路公式了. 在上一篇博客.http://ww