Cod sursa(job #1392836)

Utilizator VladuZ1338Vlad Vlad VladuZ1338 Data 18 martie 2015 22:13:10
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cstring>
#define nmax 100001
#define MOD 100003
#define ll long long
using namespace std;

char v[nmax];
long long p, sol1=1, n, i, nre, nrv, sol2=1, sol3=1, sol4=1, auxi;

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

int main()
{
    freopen ("spion.in", "r", stdin);
    freopen ("spion.out", "w", stdout);
    scanf ("%d", &p);
    getc(stdin);
    gets(v);
    n=strlen(v);
    //printf("%s %d",v,n);

    if (p==1)
    {
        for (i=0; i<n; i++)
        {
            if (v[i]=='E') sol1++;
        }
        printf ("%d", sol1);
    }
    if (p==2)
    {
        for (i=0; i<n; i++)
        {
            if (v[i]=='E') nre++;
            if (v[i]=='V') nrv++;
            sol2=sol2*(i+1);
            sol2=sol2%MOD;
        }
        for (i=1; i<=nre; i++)
        {
            sol3=sol3*i;
            sol3=sol3%MOD;
        }
        for (i=1; i<=nrv; i++)
        {
            sol4=sol4*i;
            sol4=sol4%MOD;
        }
        ll inv=0, ins;
        gcd(inv, ins, sol3, MOD);
        if (inv <= 0)
        inv = MOD + inv % MOD;
        sol3=inv;
        inv=0; gcd(inv, ins, sol4, MOD);
        if (inv <= 0)
        inv = MOD + inv % MOD;
        sol4=inv;
        auxi=(sol2*sol3)%MOD;
        auxi=(auxi*sol4)%MOD;
        printf ("%d", auxi);
    }
}