Rezolvare completă PbInfo #701 Numere4

Irinei îi plac numerele naturale. Ea știe că orice număr natural cu cifre nenule se poate reprezenta ca un șir de cifre din mulțimea A={1, 2,..., 9}. Irina își alege o cifră k şi îşi propune să afle câte numere naturale au suma cifrelor egală cu un număr dat S și în același timp se reprezintă folosind doar cifre din mulţimea {1, 2,..., k}.

Cerința

Dându-se S şi k, se cere să se determine ultima cifră a numărului de numere naturale care se reprezintă doar cu cifre din mulțimea {1,...,k} și au suma cifrelor egală cu S.

Date de intrare

Fișierul de intrare numere4.in conține pe prima linie numerele naturale T şi k, separate printr-un spaţiu, unde T reprezintă numărul de teste, iar k are semnificaţia din enunţ.
Pe linia a doua se găsesc T numere naturale, separate prin câte un spaţiu. Al i-lea număr de pe linia a doua reprezintă suma S corespunzătoare celui de-al i-lea test.

Date de ieșire

Fișierul de ieșire numere4.out va conține pe prima linie, separate prin câte un spaţiu, T cifre calculate conform cerinţelor, în ordinea dată de fişierul de intrare.

Restricții și precizări

  • 1 ≤ T ≤ 10
  • 2 ≤ k ≤ 5
  • 1 ≤ S ≤ 230

Exemplu

numere4.in

2 3
3 5

numere4.out

4 3

Explicație

Cu cifrele {1,2,3} şi suma cifrelor egală cu 3 putem scrie numerele 111, 12, 21, 3 deci 4 numere. Ultima cifră lui 4 este 4.

Cu cifrele {1,2,3} şi suma cifrelor egală cu 5 putem scrie numerele 11111, 1112, 1121, 1211, 2111, 122, 212, 221, 113, 131, 311, 23, 32 deci 13 numere. Ultima cifră lui 13 este 3.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Numere4:

#include<stdio.h>
int t,s,k,nr,j,i,l,per1,per2,p,z,it;
int d[100009];
int x[100009];
int main()
{
    freopen("numere4.in","rt",stdin);
    freopen("numere4.out","wt",stdout);
    scanf("%d %d",&t,&k);
    p=1;
    for (i=1;i<k;i++)p=p*10;
    for (it=1;it<=t;it++)
    {
        scanf("%d",&s);

        for (i=0;i<p*10;i++)
            d[i]=-1;
        x[0]=1;
        nr=1;
        for (i=1;i<k;i++)
        {
            x[i]=0;
            for (l=1;l<=k;l++)
            {
                if (i-l>=0)
                    x[i]=(x[i]+x[i-l])%10;
            }
            nr=nr*10+x[i];
            d[nr]=i;
        }
        for (i=k;i<=s; i++)
        {
            x[i]=0;
            for (l=1;l<=k;l++)
            {
                if (i-l>=0)
                    x[i]=(x[i]+x[i-l])%10;
            }
            nr=nr%p;
            nr=nr*10+x[i];
            if (d[nr]!=-1 && nr>0) {
                per1=d[nr]; per2=i;break;
            }
            else d[nr]=i;
        }
        if (i>s)z=x[s];
        else z=x[s%(per2-per1)];
        printf("%d ",z);
    }

    fclose(stdout);
    fclose(stdin);
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #701 Numere4

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #701 Numere4 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!