Language: C++

#define ANSWER
#ifndef ANSWER
#include "mydp.hpp"
#endif

#include <algorithm>
#include <vector>
#include <iostream>
#include <numeric>
#include <cmath>


class mydp {
    public:
        mydp(long long max_,int target_number_,int repetitions_)
        {
            max = max_;
            target_number = target_number_;
            repetitions = repetitions_;
            digits = std::floor(std::log10(max))+1;
            dp.resize(digits+1);
            for (auto &&dp_ : dp)
            {
                dp_.resize(2);
                for (auto &&dp__ : dp_)
                {
                    dp__.resize(repetitions+1);
                }
            }
            max_by_digits.resize(digits);
            for (int i = digits - 1; i >= 0; i--)
            {
                max_by_digits[i] = max_%10;
                max_ /= 10;
            }
        }
        std::vector<std::vector<std::vector<long long>>> dp;
        long long answer(int repetetion_);
        void run();
        long long max;
        std::vector<int> max_by_digits;
        int digits;
        int target_number;
        int repetitions;
};

#ifndef ANSWER
#include "mydp.hpp"
#endif

void mydp::run()
{
    dp[0][0][0] = 1;
    for (int i = 0; i < digits; i++)
    {
        for (int smaller = 0; smaller < 2; smaller++)
        {
            for (int j = 0; j < repetitions+1; j++)
            {
                for (int x = 0; x <= (smaller ? 9 : max_by_digits[i]); x++)
                {
                    dp[i + 1][smaller || x < max_by_digits[i]][j + (x > 0)] += dp[i][smaller][j];
                }
            }
        }
    }
}

long long mydp::answer(int repetetion_){
    long long answer = 0;
    
    answer += dp[digits][0][repetetion_];
    answer += dp[digits][1][repetetion_];
    
    return answer;
}


void mydp::run()
{
    dp[0][0][0] = 1;
    for (int i = 0; i < digits; i++)
    {
        for (int smaller = 0; smaller < 2; smaller++)
        {
            for (int j = 0; j < repetitions+1; j++)
            {
                for (int x = 0; x <= (smaller ? 9 : max_by_digits[i]); x++)
                {
                    dp[i + 1][smaller || x < max_by_digits[i]][j + (x > 0)] += dp[i][smaller][j];
                }
            }
        }
    }
}

long long mydp::answer(int repetetion_){
    long long answer = 0;
    
    answer += dp[digits][0][repetetion_];
    answer += dp[digits][1][repetetion_];
    
    return answer;
}#include <algorithm>
#include <vector>
#include <iostream>
#include <numeric>
#include <cmath>


class mydp {
    public:
        mydp(long long max_,int target_number_,int repetitions_)
        {
            max = max_;
            target_number = target_number_;
            repetitions = repetitions_;
            digits = std::floor(std::log10(max))+1;
            dp.resize(digits+1);
            for (auto &&dp_ : dp)
            {
                dp_.resize(2);
                for (auto &&dp__ : dp_)
                {
                    dp__.resize(repetitions+1);
                }
            }
            max_by_digits.resize(digits);
            for (int i = digits - 1; i >= 0; i--)
            {
                max_by_digits[i] = max_%10;
                max_ /= 10;
            }
        }
        std::vector<std::vector<std::vector<long long>>> dp;
        long long answer(int repetetion_);
        void run();
        long long max;
        std::vector<int> max_by_digits;
        int digits;
        int target_number;
        int repetitions;
};
#ifndef ANSWER
#include "mylist.hpp"
#endif

template <typename T> 
void mylist<T>::input(){
    mystd::InputArray<T>(list);
}

template <typename T> 
void mylist<T>::sort(){
    std::sort(list.begin(), list.end());
};

template <typename T> 
std::vector<size_t> mylist<T>::argsort(){
    std::vector<size_t> index(list.size());
    std::iota(index.begin(), index.end(), 0);

    std::sort(index.begin(), index.end(), [this](size_t i1, size_t i2) {
        return this->list[i1] < this->list[i2];
    });

    return index;
};

template <typename T> 
int mylist<T>::find(T key){
    typename std::vector<T>::iterator iter = std::find(list.begin(), list.end(), key);
    if (iter == list.end())
    {
        return -1;
    }
    else
    {
        return std::distance(list.begin(), iter);
    }
}

template <typename T> 
T mylist<T>::pop(size_t i){
    T ans = list[i];
    list.erase(list.begin()+i);
    return ans;
}

template <typename T> 
void mylist<T>::push(T value){
    list.push_back(value);
}

template <typename T> 
void mylist<T>::push(mylist<T> list_){
    std::copy(list_.list.begin(),list_.list.end(),std::back_inserter(list_.list));
}

template <typename T> 
mylist<T> mylist<T>::iloc(mylist<T> list_){
    mylist<T> ans;
    for (auto &&i : list_.list)
    {
        ans.list.push_back(list[i]);
    }
    return ans;
}


template <typename T> 
std::string mylist<T>::toString(){
    std::string string(list.begin(), list.end());
    return string;
}

template <typename T> 
void mylist<T>::fromString(std::string string){
    mylist<char> S;
    std::copy(string.begin(), string.end(), std::back_inserter(list));
}

template <typename T> 
void mylist<T>::fromAlphabets(std::string string){
    std::transform(string.begin(), string.end(), string.begin(), ::tolower);
    for (size_t i = 0; i < string.size(); i++)
    {
        typename std::vector<char>::iterator iter = std::find(alphabets.begin(), alphabets.end(), string[i]);
        list.push_back(std::distance(alphabets.begin(), iter));
    }            
}

template <typename T> 
std::string mylist<T>::toAlphabets(bool upper){
    std::string alp;
    for (auto &&i : list)
    {
        alp.push_back(alphabets[i - std::floor(i / alphabets.size()) * alphabets.size()]);
    }
    if (upper)
    {
        std::transform(alp.begin(), alp.end(), alp.begin(), ::toupper);
    }
    
    return alp;     
}

template <typename T> 
template <typename V> 
void mylist<T>::add(V value){
    for (auto &&i : list)
    {
        i+=value;
    }
}

template <typename T> 
void mylist<T>::range(){
    std::iota(list.begin(), list.end(), 0);
}

template <typename T> 
void mylist<T>::range(long long length){
    list.resize(length);
    std::iota(list.begin(), list.end(), 0);
}

template <typename T> 
void mylist<T>::range(long long start,long long end){
    list.resize(end-start);
    std::iota(list.begin(), list.end(), start);
}

template <typename T> 
size_t mylist<T>::min_index(){
    typename std::vector<T>::iterator iter = std::min_element(list.begin(), list.end());
    return std::distance(list.begin(), iter);
}

template <typename T> 
T mylist<T>::min(){
    typename std::vector<T>::iterator iter = std::min_element(list.begin(), list.end());
    return list[std::distance(list.begin(), iter)];
}

template <typename T> 
size_t mylist<T>::max_index(){
    typename std::vector<T>::iterator iter = std::max_element(list.begin(), list.end());
    return std::distance(list.begin(), iter);
}

template <typename T> 
T mylist<T>::max(){
    typename std::vector<T>::iterator iter = std::max_element(list.begin(), list.end());
    return list[std::distance(list.begin(), iter)];
}

#include <algorithm>
#include <vector>
#include <iostream>
#include <numeric>
#include <cmath>


template <typename T> 
class mylist {
    private:
        std::vector<char> alphabets = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    public:
        mylist(long long i)
        {
            list.resize(i);
        }
        mylist()
        {}
        void input();

        std::vector<T> list;
        void sort();
        std::vector<T> sorted();
        std::vector<size_t> argsort();
        int find(T key);

        T pop(size_t i);
        void push(T value);
        void push(mylist<T> list_);

        mylist<T> iloc(mylist<T> list_);
        
        std::string toString();
        void fromString(std::string string);
        void fromAlphabets(std::string string);
        std::string toAlphabets(bool upper);
        template <typename V>
        void add(V value);

        void range();
        void range(long long length);
        void range(long long start,long long end);

        size_t min_index();
        T min();
        size_t max_index();
        T max();
};
#ifndef ANSWER
#include "mymath.hpp"
#endif

template <typename T>
T mystd::factorical(T a)
{
    T ans = 1;
    for (size_t i = 0; i < a; i++)
    {
        ans *= i + 1;
    }
    return ans;
}

template <typename T>
T mystd::LCM(T a, T b)
{
    return a * b / GCD(a,b);
}

template <typename T>
T mystd::GCD(T a, T b)
{
    if (a < b)
    {
        T tmp = a;
        a = b;
        b = tmp;
    }

    T r = a % b;
    while (r != 0)
    {
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}

template <typename T>
T mystd::LCM(std::vector<T> a)
{
    if (a.size() < 1)
    {
        return 1;
    }
    else
    {
        T lcm = LCM(a[0], a[1]);
        for (size_t i = 1; i < a.size() - 1; i++)
        {
            T lcm_temp = LCM(lcm, a[i + 1]);
            if (lcm < lcm_temp){
                lcm = lcm_temp;
            }
        }
        return lcm;
    }
}

template <typename T>
T mystd::LCM(mylist<T> a)
{
    if (a.list.size() < 1)
    {
        return 1;
    }
    else
    {
        T lcm = LCM(a.list[0], a.list[1]);
        for (size_t i = 1; i < a.list.size() - 1; i++)
        {
            T lcm_temp = LCM(lcm, a.list[i + 1]);
            if (lcm < lcm_temp){
                lcm = lcm_temp;
            }
        }
        return lcm;
    }
}

template <typename T>
T mystd::GCD(std::vector<T> a)
{
    if (a.list.size() < 1)
    {
        return 1;
    }
    else
    {
        T gcd = GCD(a[0], a[1]);
        for (size_t i = 1; i < a.size() - 1; i++)
        {
            T gcd_temp = GCD(gcd, a[i + 1]);
            if (gcd < gcd_temp){
                gcd = gcd_temp;
            }
        }
        return gcd;
    }
}

template <typename T>
T mystd::GCD(mylist<T> a)
{
    if (a.list.size() < 1)
    {
        return 1;
    }
    else
    {
        T gcd = GCD(a.list[0], a.list[1]);
        for (size_t i = 1; i < a.list.size() - 1; i++)
        {
            T gcd_temp = GCD(gcd, a.list[i + 1]);
            if (gcd < gcd_temp){
                gcd = gcd_temp;
            }
        }
        return gcd;
    }
}
namespace mystd
{
template <typename T>
T factorical(T a);
template <typename T>
T LCM(T a, T b);
template <typename T>
T GCD(T a, T b);
template <typename T>
T LCM(std::vector<T> A);
template <typename T>
T GCD(std::vector<T> A);
template <typename T>
T LCM(mylist<T> A);
template <typename T>
T GCD(mylist<T> A);
} // namespace mystd
#ifndef ANSWER
#include "mystd.hpp"
#endif

template<typename T>
bool mystd::Input(int number,...){
    va_list args;
    va_start(args, number);
    for (long long i = 0; i < number; i++)
    {
        std::cin >> *(va_arg(args, T*));
    }
    return true;
}

template<typename T>
void mystd::Print(int number,...){
    va_list args;
    va_start(args, number);
    for (long long i = 0; i < number; i++)
    {
        if(i!=0){
            std::cout << " ";
        }
        std::cout << *(va_arg(args, T*));
    }
    std::cout << std::endl;;
}

template<typename T>
void mystd::PrintArray(std::vector<T> array,const std::string sep){
    for (long long i = 0; i < array.size(); i++)
    {
        if(i!=0){
            std::cout << sep;
        }
        std::cout << array[i];
    }
    std::cout << std::endl;;
}

template<typename T>
bool mystd::InputArray(std::vector<T> &array){
    for (size_t i = 0; i < array.size(); i++)
    {
        std::cin >> array[i];
    }
    return true;
}

bool mystd::InputArrays(long long number,...){
    va_list args;
    va_start(args, number);
    std::vector<std::vector<long long>*> arrays(number);
    for (auto &i : arrays)
    {
        i = va_arg(args, std::vector<long long>*);
    }
    long long length = arrays[0]->size();

    for (long long j=0;j<length;j++)
    {
        for (auto &&i : arrays)
        {
            std::cin >> (*i)[j];
        }
    }
    return true;
}


long long mystd::min(std::vector<long long> array){
    long long ans = array[0];
    for (long long &i : array)
    {
        if(i < ans){
            ans = i;
        }
    }
    return ans;
}


long long mystd::max(std::vector<long long> array){
    long long ans = array[0];
    for (long long &i : array)
    {
        if(i > ans){
            ans = i;
        }
    }
    return ans;
}

#include <iostream>
#include <vector>
#include <cstdarg>
#include <cmath>
#include <string>

namespace mystd
{
    template<typename T>
    static bool Input(int number,...);
    template<typename T>
    static bool InputArray(std::vector<T> &array);
    static bool InputArrays(long long number,...);
    static bool InputMatrix(std::vector<std::vector<long long>> array);
    static long long min(std::vector<long long> array);
    static long long max(std::vector<long long> array);
    template<typename T>
    static void Print(int number,...);
    template<typename T>
    static void PrintArray(std::vector<T> array,const std::string sep);
};
// #include <algorithm>
// #include <vector>
// #include <iostream>
// #include <numeric>
// #include <string>
 
// class mystring {
//     public:
//         std::string str;
//         void sort(); 
//         std::string sorted();
//         std::string argsort();
//         int find(std::string key){
//             typename std::string::iterator iter = std::find(string.begin(), string.end(), key);
//             return std::distance(string.begin(), iter);
//         };
// };

// #include <algorithm>
// #include <vector>
// #include <iostream>
// #include <numeric>
// #include <string>
 
// class mystring {
//     public:
//         std::string str;
//         void sort(); 
//         std::string sorted();
//         std::string argsort();
//         int find(std::string key){
//             typename std::string::iterator iter = std::find(string.begin(), string.end(), key);
//             return std::distance(string.begin(), iter);
//         };
// };

#ifndef ANSWER
#include "../../library/mystd.cpp"
#include "../../library/mylist.cpp"
#include "../../library/mymath.cpp"
#include "../../library/mydp.cpp"
#endif

typedef long long ll;
typedef std::vector<long long> vll;
typedef long double ld;
typedef std::vector<long double> vld;

using namespace mystd;

void Main(){
    ll N,K;
    Input<ll>(2,&N,&K);

    mydp dp(N,0,K);
    dp.run();
    std::cout << dp.answer(K) << std::endl;

    // Print<ll>(1,&j);
}

int main(int argc, char const *argv[])
{
    Main();
    return 0;
}

Compiler output:
a.cc:104:2: error: stray '#' in program
  104 | }#include <algorithm>
      |  ^
a.cc:79:6: error: redefinition of 'void mydp::run()'
   79 | void mydp::run()
      |      ^~~~
a.cc:51:6: note: 'void mydp::run()' previously defined here
   51 | void mydp::run()
      |      ^~~~
a.cc:97:11: error: redefinition of 'long long int mydp::answer(int)'
   97 | long long mydp::answer(int repetetion_){
      |           ^~~~
a.cc:69:11: note: 'long long int mydp::answer(int)' previously defined here
   69 | long long mydp::answer(int repetetion_){
      |           ^~~~
a.cc:104:3: error: 'include' does not name a type
  104 | }#include <algorithm>
      |   ^~~~~~~
a.cc:149:12: error: expected initializer before '<' token
  149 | void mylist<T>::input(){
      |            ^
a.cc:154:12: error: expected initializer before '<' token
  154 | void mylist<T>::sort(){
      |            ^
a.cc:159:27: error: expected initializer before '<' token
  159 | std::vector<size_t> mylist<T>::argsort(){
      |                           ^
a.cc:171:11: error: expected initializer before '<' token
  171 | int mylist<T>::find(T key){
      |           ^
a.cc:184:9: error: expected initializer before '<' token
  184 | T mylist<T>::pop(size_t i){
      |         ^
a.cc:191:12: error: expected initializer before '<' token
  191 | void mylist<T>::push(T value){
      |            ^
a.cc:196:12: error: expected initializer before '<' token
  196 | void mylist<T>::push(mylist<T> list_){
      |            ^
a.cc:201:1: error: 'mylist' does not name a type
  201 | mylist<T> mylist<T>::iloc(mylist<T> list_){
      | ^~~~~~
a.cc:212:19: error: expected initializer before '<' token
  212 | std::string mylist<T>::toString(){
      |                   ^
a.cc:218:12: error: expected initializer before '<' token
  218 | void mylist<T>::fromString(std::string string){
      |            ^
a.cc:224:12: error: expected initializer before '<' token
  224 | void mylist<T>::fromAlphabets(std::string string){
      |            ^
a.cc:234:19: error: expected initializer before '<' token
  234 | std::string mylist<T>::toAlphabets(bool upper){
      |                   ^
a.cc:250:6: error: too many template-parameter-lists
  250 | void mylist<T>::add(V value){
      |      ^~~~~~
a.cc:258:12: error: expected initializer before '<' token
  258 | void mylist<T>::range(){
      |            ^
a.cc:263:12: error: expected initializer before '<' token
  263 | void mylist<T>::range(long long length){
      |            ^
a.cc:269:12: error: expected initializer before '<' token
  269 | void mylist<T>::range(long long start,long long end){
      |            ^
a.cc:275:14: error: expected initializer before '<' token
  275 | size_t mylist<T>::min_index(){
      |              ^
a.cc:281:9: error: expected initializer before '<' token
  281 | T mylist<T>::min(){
      |         ^
a.cc:287:14: error: expected initializer before '<' token
  287 | size_t mylist<T>::max_index(){
      |              ^
a.cc:293:9: error: expected initializer before '<' token
  293 | T mylist<T>::max(){
      |         ^
a.cc:351:3: error: 'mystd' has not been declared
  351 | T mystd::factorical(T a)
      |   ^~~~~
a.cc:362:3: error: 'mystd' has not been declared
  362 | T mystd::LCM(T a, T b)
      |   ^~~~~
a.cc:368:3: error: 'mystd' has not been declared
  368 | T mystd::GCD(T a, T b)
      |   ^~~~~
a.cc:388:3: error: 'mystd' has not been declared
  388 | T mystd::LCM(std::vector<T> a)
      |   ^~~~~
a.cc:409:3: error: 'mystd' has not been declared
  409 | T mystd::LCM(mylist<T> a)
      |   ^~~~~
a.cc:430:3: error: 'mystd' has not been declared
  430 | T mystd::GCD(std::vector<T> a)
      |   ^~~~~
a.cc:451:3: error: 'mystd' has not been declared
  451 | T mystd::GCD(mylist<T> a)
      |   ^~~~~
a.cc:492:33: error: 'bool mystd::Input(int, ...)' should have been declared inside 'mystd'
  492 | bool mystd::Input(int number,...){
      |                                 ^
a.cc: In function 'bool mystd::Input(int, ...)':
a.cc:494:5: error: there are no arguments to 'va_start' that depend on a template parameter, so a declaration of 'va_start' must be available [-fpermissive]
  494 |     va_start(args, number);
      |     ^~~~~~~~
a.cc:494:5: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
a.cc:497:37: error: expected primary-expression before '*' token
  497 |         std::cin >> *(va_arg(args, T*));
      |                                     ^
a.cc:497:38: error: expected primary-expression before ')' token
  497 |         std::cin >> *(va_arg(args, T*));
      |                                      ^
a.cc:497:23: error: there are no arguments to 'va_arg' that depend on a template parameter, so a declaration of 'va_arg' must be available [-fpermissive]
  497 |         std::cin >> *(va_arg(args, T*));
      |                       ^~~~~~
a.cc: At global scope:
a.cc:503:33: error: 'void mystd::Print(int, ...)' should have been declared inside 'mystd'
  503 | void mystd::Print(int number,...){
      |                                 ^
a.cc: In function 'void mystd::Print(int, ...)':
a.cc:505:5: error: there are no arguments to 'va_start' that depend on a template parameter, so a declaration of 'va_start' must be available [-fpermissive]
  505 |     va_start(args, number);
      |     ^~~~~~~~
a.cc:511:38: error: expected primary-expression before '*' token
  511 |         std::cout << *(va_arg(args, T*));
      |                                      ^
a.cc:511:39: error: expected primary-expression before ')' token
  511 |         std::cout << *(va_arg(args, T*));
      |                                       ^
a.cc:511:24: error: there are no arguments to 'va_arg' that depend on a template parameter, so a declaration of 'va_arg' must be available [-fpermissive]
  511 |         std::cout << *(va_arg(args, T*));
      |                        ^~~~~~
a.cc: At global scope:
a.cc:517:66: error: 'void mystd::PrintArray(std::vector<T>, std::string)' should have been declared inside 'mystd'
  517 | void mystd::PrintArray(std::vector<T> array,const std::string sep){
      |                                                                  ^
a.cc:529:45: error: 'bool mystd::InputArray(std::vector<T>&)' should have been declared inside 'mystd'
  529 | bool mystd::InputArray(std::vector<T> &array){
      |                                             ^
a.cc:537:45: error: 'bool mystd::InputArrays(long long int, ...)' should have been declared inside 'mystd'
  537 | bool mystd::InputArrays(long long number,...){
      |                                             ^
a.cc: In function 'bool mystd::InputArrays(long long int, ...)':
a.cc:539:5: error: 'va_start' was not declared in this scope
  539 |     va_start(args, number);
      |     ^~~~~~~~
a.cc:539:5: note: the macro 'va_start' had not yet been defined
In file included from /usr/include/c++/14/cstdarg:43,
                 from a.cc:583:
/usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h:50:9: note: it was later defined here
   50 | #define va_start(v,l)   __builtin_va_start(v,l)
      |         ^~~~~~~~
a.cc:543:48: error: expected primary-expression before '*' token
  543 |         i = va_arg(args, std::vector<long long>*);
      |                                                ^
a.cc:543:49: error: expected primary-expression before ')' token
  543 |         i = va_arg(args, std::vector<long long>*);
      |                                                 ^
a.cc:543:13: error: 'va_arg' was not declared in this scope
  543 |         i = va_arg(args, std::vector<long long>*);
      |             ^~~~~~
a.cc:543:13: note: the macro 'va_arg' had not yet been defined
/usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h:53:9: note: it was later defined here
   53 | #define va_arg(v,l)     __builtin_va_arg(v,l)
      |         ^~~~~~
a.cc: At global scope:
a.cc:558:50: error: 'long long int mystd::min(std::vector<long long int>)' should have been declared inside 'mystd'
  558 | long long mystd::min(std::vector<long long> array){
      |                                                  ^
a.cc:570:50: error: 'long long int mystd::max(std::vector<long long int>)' should have been declared inside 'mystd'
  570 | long long mystd::max(std::vector<long long> array){
      |                                                  ^
a.cc: In function 'void Main()':
a.cc:654:14: error: call of overloaded 'Input<ll>(int, ll*, ll*)' is ambiguous
  654 |     Input<ll>(2,&N,&K);
      |     ~~~~~~~~~^~~~~~~~~
a.cc:492:6: note: candidate: 'bool mystd::Input(int, ...) [with T = long long int]'
  492 | bool mystd::Input(int number,...){
      |      ^~~~~
a.cc:590:17: note: candidate: 'bool mystd::Input(int, ...) [with T = long long int]'
  590 |     static bool Input(int number,...);
      |                 ^~~~~