Cod sursa(job #3245466)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 29 septembrie 2024 09:56:01
Problema Grigo Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
/*#include <fstream>
#include <vector>
using namespace std;
ifstream cin("grigo.in");
ofstream cout("grigo.out");
const int Nmax = 100000;
const int MOD = 1000003;
long long fastpow(long long a, int b)
{
    long long ans = 1;
    while(b)
    {
        if(b % 2)
            ans = (ans * a) % MOD;
        a = (a * a) % MOD;
        b /= 2;
    }
    return ans;
}
vector <long long> factorial(Nmax + 1), invfact(Nmax + 1);
int n, m, poz[Nmax];

long long comb(int n, int k)
{
    if(k < 0 || k > n)
        return 0LL;
    return ((factorial[n] * invfact[k]) % MOD * invfact[n-k]) % MOD;
}
int main()
{
    cin >> n >> m;
    for(int i=1; i<=m; i++)
        cin >> poz[i];
    factorial[0] = 1;
    for(int i=1; i<=Nmax; i++)
        factorial[i] = (factorial[i-1] * i) % MOD;

    invfact[Nmax] = fastpow(factorial[Nmax], MOD - 2);
    for (int i = Nmax - 1; i >= 0; i--)
    invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD;
    cout << (comb(n-1, m-1) * factorial[n - m]) % MOD;
    return 0;
}*/
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("grigo.in");
ofstream cout("grigo.out");
const int Nmax = 100000;
const int MOD = 1000003;
int n, m, x[Nmax], cnt, poz[Nmax];
bool valid(int k)
{
    for(int i=1; i<k; i++)
        if(x[i] == x[k])
            return 0;

    for (int i = 1; i < m; i++)
        if (poz[i] < k && x[poz[i]] >= x[poz[i + 1]])
                return false;


    return 1;
}
void bkt(int k)
{
    for(int i=1; i<=n; i++)
    {
        x[k] = i;
        if(valid(k))
        {
            if(k == n && x[m] == n)
                cnt++;
            else
                bkt(k+1);
        }

    }
}
int main()
{
    cin >> n >> m;
    for(int i=1; i<=m; i++)
        cin >> poz[i];
    bkt(1);
    cout << cnt;
}