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 doua40p
- 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; }