Cod sursa(job #1394433)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 20 martie 2015 12:17:23
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

#define NMax 1000001
#define MOD 1000003

using namespace std;

ifstream f("mergesort.in");
ofstream g("mergesort.out");

int n, fact[NMax], funct[NMax], inv[NMax];

void gcd(int &x, int &y, int a, int b)
{
     if (!b)
         x = 1, y = 0;
     else
     {
         gcd(x, y, b, a % b);
         int aux = x;
         x = y;
         y = aux - y * (a / b);
     }
}

int main()
{
    f>>n;
    n++;

    fact[0] = 1;
    for (int i=1; i<=n; ++i)
        fact[i] = (1LL * fact[i-1] * i) % MOD;

    for (int i=1; i<=n; i++) {
        int ins;
        gcd(inv[i], ins, fact[i], MOD);
        if (inv[i] <= 0)
            inv[i] = MOD + inv[i] % MOD;
    }

//    comb[1][0]=1;
//    comb[1][1]=1;
//    for (int i=2; i<=n; i++)
//        for (int j=0; j<=n; j++)
//            comb[i][j] = (comb[i-1][j-1] + comb[i-1][j]) % MOD;

    funct[1] = 1;

    for (int l=2; l<=n; l++) {

        int b = l / 2;
        int a = l - b;
        int comb = (1LL * fact[l] * inv[l-a] * inv[a]) % MOD;
        funct[l] = (1LL * comb * (1LL * funct[a] * fact[b] + 1LL * funct[b] * fact[a]) + fact[l] - 2) % MOD;

    }

    g<<funct[n-1];

    return 0;
}