Cod sursa(job #2330403)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 28 ianuarie 2019 12:32:51
Problema Kperm Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

using namespace std;

int ct = 0 , m , n;
const int NMAX = 25;
const int NMAX1 = 5005;
const int MOD = 666013;
int st[NMAX];
bool viz[NMAX];
int fact[NMAX1];

inline void genereazaFactorial(int n)
{
    fact[0] = 1;
    for(int i = 1 ; i <= n ; i++)
        fact[i] = 1ll*(fact[i-1]*i)%MOD;
}

void backtracking(int k)
{
    if(k == n+1)
    {
        int sum = 0;
        for(int i = 1 ; i <= m ; i++)
            sum += st[i];
        if(sum % m != 0)
            return;
        for(int i = m+1 ; i < k ; i++)
            {
                sum -= st[i-m];
                sum += st[i];
                if(sum % m != 0)
                    return;
            }
        ct++;
        ct %= MOD;
        return;
    }
    for(int i = 1 ; i <= n ; i++)
    {
        st[k] = i;
        if(!viz[st[k]])
        {
            viz[st[k]] = 1;
            backtracking(k+1);
            viz[st[k]] = 0;
        }
    }
}

int main()
{
    freopen("kperm.in","r",stdin);
    freopen("kperm.out","w",stdout);
    scanf("%d%d",&n,&m);
    if(n <= 20)
    {
        backtracking(1);
        printf("%d",ct);
        return 0;
    }
    if(n == m)
    {
        genereazaFactorial(5000);
        printf("%d",fact[n]);
    }
    return 0;
}