Codeforces Round #555 (Div. 3)------A. Reachable Numbers(set查找)

探讨一个数学函数f(x),通过特定规则将x增加1并去除尾部零,直到无法去除为止。挑战在于找出从给定数字n出发,通过多次应用该函数可以达到的不同数字的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Reachable Numbers

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Let's denote a function f(x)f(x) in such a way: we add 11 to xx, then, while there is at least one trailing zero in the resulting number, we remove that zero. For example,

  • f(599)=6f(599)=6: 599+1=600→60→6599+1=600→60→6;
  • f(7)=8f(7)=8: 7+1=87+1=8;
  • f(9)=1f(9)=1: 9+1=10→19+1=10→1;
  • f(10099)=101f(10099)=101: 10099+1=10100→1010→10110099+1=10100→1010→101.

We say that some number yy is reachable from xx if we can apply function ff to xx some (possibly zero) times so that we get yy as a result. For example, 102102 is reachable from 1009810098 because f(f(f(10098)))=f(f(10099))=f(101)=102f(f(f(10098)))=f(f(10099))=f(101)=102; and any number is reachable from itself.

You are given a number nn; your task is to count how many different numbers are reachable from nn.

Input

The first line contains one integer nn (1≤n≤1091≤n≤109).

Output

Print one integer: the number of different numbers that are reachable from nn.

Examples

input

Copy

1098

output

Copy

20

input

Copy

10

output

Copy

19

Note

The numbers that are reachable from 10981098 are:

1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,1098,10991,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,1098,1099.


https://codeforces.com/contest/1157/problem/A

 

#include<set>
#include<map>
#include<cmath>
#include<vector>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include <fstream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    set<int>s;
    set <int> :: iterator it;;
    s.insert(n);
    n++;
    while(n%10==0)
    {
        if(n%10==0)
            n=n/10;
    }
    while(1)
    {
        if(s.count(n)==0)
        {
            s.insert(n);
              n++;
            while(n%10==0)
            {
                if(n%10==0)
                    n=n/10;
            }
        }
        else if(s.count(n)==1)
        {
            break;
        }
    }
    cout<< s.size()<<endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值