SPOJ: Dwie cyfry silni

0

Cześć, mam problem z prostym zadankiem ponieważ kompilator mi tego nie akceptuje : Przekroczono limit czasu
Link do zadania : https://pl.spoj.com/problems/FCTRL3/

#include <iostream>

using namespace std;

int main()
{

    int d;
    cin>>d;
    int tablica[d], silnia[d], k;
    double dz, j;
    for(int i=0;i<d;i++)
    {
        cin>>tablica[i];
    }

    for(int i=0;i<d;i++)
    {
        k=tablica[i];
        silnia[i]=k;
        if(k==1 || k==0)
        {
            cout<<endl<<"0"<<" 1";
        }

        while(k>1)
        {

            k--;
            silnia[i]=silnia[i]*k;
        }
        if(silnia[i]!=0 && silnia[i]!=1)
        {
        j=(silnia[i])%10;
        dz=(silnia[i]/10)%10;
        cout<<endl<<dz<<" "<<j;
        }
    }

}
3

Protip: skup się na ostatnich cyfrach i zastanów czy na pewno musisz mnożyć za każdym razem całe liczby. W większości zadań na SPOJu chodzi o to, aby ruszyć głową, a nie pisać na pałę.

Btw, już do policzenia 100! potrzebowałbyś liczby o rozmiarze 525 bitów, a gdzie dopiero te miliony ;-)

3

Podpowiedź: policz wszystkie możliwe wyniki n! % 100 od n=0 do n=14 i rusz głową.

0

Dziękuję za podpowiedzi udało się :)

#include <iostream>

using namespace std;

int main()
{

    int d;
    cin>>d;
    int tablica[d], silnia[d], k;
    double dz, j;
    for(int i=0;i<d;i++)
    {
        cin>>tablica[i];
    }

    for(int i=0;i<d;i++)
    {
        k=tablica[i];
        silnia[i]=k;
        if(k==1 || k==0)
        {
            cout<<endl<<"0"<<" 1";
        }
        if(k<10 && k>1)
        {
          while(k>1)
        {

            k--;
            silnia[i]=silnia[i]*k;
        }
        if(silnia[i]!=0 && silnia[i]!=1)
        {
        j=(silnia[i])%10;
        dz=(silnia[i]/10)%10;
        }
        cout<<endl<<dz<<" "<<j;
        }
        if(k>9)
        {
            dz=0;
            j=0;
            cout<<endl<<dz<<" "<<j;
        }


        }
    }
2
const char* fractionMod100(size_t n)
{
    static constexpr const std::array<const char *, 11> results {
        "0 1\n",
        "0 1\n",
        "0 2\n",
        "0 6\n",
        "2 4\n",
        "2 0\n",
        "2 0\n",
        "4 0\n",
        "2 0\n",
        "8 0\n",
        "0 0\n"
    };
    return results[std::min(n, results.size() - 1)];
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1