fbpx

Problema #1925 – Numar9 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dau două numere naturale S şi K. Să se afle cel mai mic număr natural A care are suma cifrelor egală cu S, precum şi restul împărţirii lui A la K.

Date de intrare

Fișierul de intrare numar9.in conține pe prima linie numerele naturale S şi K.

Date de ieșire

Fișierul de ieșire numar9.out va conține pe prima linie numărul A, iar pe a doua linie restul împărţirii lui A la K.

Restricții și precizări

  • 1 ≤ S ≤ 20.000.000
  • 1 ≤ K ≤ 1.000.000
  • Pentru prima cerinţă se acordă 60p, iar pentru a doua 40p
  • Pentru a primi punctajul pentru a doua cerinţă, în fişierul numar9.out trebuie să afişaţi două numere

Exemplu

numar9.in

25 13

numar9.out

799
6

Explicație

Cel mai mic număr natural care are suma cifrelor egală cu 25 este 799. Restul împărţirii lui 799 la 13 este 6.

#include <bits/stdc++.h>
using namespace std;
ifstream fin ("numar9.in");
ofstream fout ("numar9.out");
int unsigned k,i,v[2200001];
int main()
{
    long long unsigned s , x , r , a , b;
    fin >> s >> k;
    r = s % 9;
    a = s / 9;
    b = a / 6;
    for (i = 1 ; i <= b ; i++) v[i]=999999;
    for (i = b + 1 ; i <= b + a % 6 ; i++) v[i]=9;
    if (r != 0 && s != 0) v[0] = r;
    x = 0;
    if (v[0] != 0)
        for (i = 0 ; i <= b + a % 6 ; i++)
        {
            fout << v[i];
            if (v[i] < 10) x = (x * 10 + v[i])% k;
            else
            {
                while (v[i]!=0)
                {
                    x = (x * 10 + v[i] % 10)% k;
                    v[i] /= 10;
                }
            }
        }
    else
        for (i = 1 ; i <= b + a % 6 ; i++)
        {
            fout<<v[i];
            if (v[i]<10) x = (x * 10 + v[i])% k;
            else
            {
                while (v[i] != 0)
                {
                    x = (x * 10 + v[i] % 10)% k;
                    v[i] /= 10;
                }
            }
        }
        fout << " " << x;
        return 0;
}
Comentarii

S-ar putea sa iti placa