kouzdra (kouzdra) wrote,
kouzdra
kouzdra

Зодачко: решение

Комменты я расскринил.

Решение вроде бы выдумали все - оно простое дополняем функцию mamba (n,х) (количество scannable чисел с характеристикой х и длиной n знаков параметром r:

mamba (n,x,r) - где r означает остаток от деления числа на три (scannable соотвествует r = 0).

После чего она прекрасно расписывается через простую рекурсию по n:

Вариант на Haskell:
mamba n = (mamba' n) !! 0 where
   mamba' 1 = [[ (toInteger . fromEnum) (x `mod` 3 == r) | x <- [0..9]] | r <- [0..2] ]
   mamba' n = [[  sum [mambas !! ((r-d) `mod` 3) !! ((x-d)`mod` 10) | d <- [0..9] ] | 
                         x <- [0..9]] | r <- [0..2]  ]
     where
      mambas = mamba' (n-1)

main = print (mamba 5)
Вариант на С++:
void mamba (long long int res [RAD], int n)
{
  long long int Tab0 [MOD][RAD];
  long long int Tab1 [MOD][RAD];
  for (int j = 0; j != MOD; ++ j)
    for (int i = 0; i != RAD; ++ i)
      Tab0 [j][i] = (i % MOD) == j;

  long long int (* tab ) [RAD] = Tab0;
  long long int (* tab1) [RAD] = Tab1;
  for (int i = 0; i != n-1; ++ i) {
      std::swap (tab, tab1);
      for (int j = 0; j != MOD; ++ j)
	for (int x = 0; x != RAD; ++ x) {
	    tab [j][x] = 0;
	    for (int d = 0; d != RAD; ++ d)
	      tab [j][x] += tab1 [(j-d+9)%MOD][(x-d+10)%10];
	  }
    }

  for (int i = 0; i != RAD; ++ i)
    res [i] = tab [0][i];
}

int main (int argc, char ** argv)
{
  long long int res [RAD];
  mamba (res, 5);
  for (int i = 0; i != RAD; ++ i)
    printf ("%d=%lld\n", i, res [i]);
  return 0;
}
Tags: компутерщина
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment