Atcoder AGC011E : Increasing Numbers

传送门

题解:
妙啊。

一个上升序列可以拆分为9个形如 1111111 1111111 的形式。 然后列出式子:

n=i=19k10ai19 n = ∑ i = 1 9 k 10 a i − 1 9

移一下项:

9n+9k=i=19k10ai 9 n + 9 k = ∑ i = 1 9 k 10 a i

枚举 k k <script type="math/tex" id="MathJax-Element-96">k</script>,然后就做完了。

#include <bits/stdc++.h>
using namespace std;

const int RLEN=1<<18|1;
inline char nc() {
    static char ibuf[RLEN],*ib,*ob;
    (ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
    return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
    char ch=nc(); int i=0,f=1;
    while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}
    while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
    return i*f;
}

const int N=5e5+50;
int n,A[N],sum;
char ch[N];
int main() {
    scanf("%s",ch); n=strlen(ch);
    for(int i=0;i<n;++i) A[n-i-1]=ch[i]-'0', sum+=A[n-i-1];
    sum*=9;
    for(int i=0;i<n;i++) A[i]*=9;
    for(int i=0;i<n;i++) {
        if(A[i]>=10) {
            sum-=A[i];
            sum-=A[i+1];
            A[i+1]+=A[i]/10;
            A[i]%=10;
            sum+=A[i];
            sum+=A[i+1];
            if(i+1>=n) ++n;
        }
    }
    for(int k=1;k<=n;++k) {
        A[0]+=9; sum+=9;
        for(int i=0;;++i) {
            if(A[i]>=10) {
                sum-=A[i];
                sum-=A[i+1];
                A[i+1]+=A[i]/10;
                A[i]%=10;
                sum+=A[i];
                sum+=A[i+1];
                if(i+1>=n) ++n;
            } else break;
        }
        if(sum<=9*k && sum%9==0) {cout<<k<<'\n'; return 0;}
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值