Cod sursa(job #277040)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 11 martie 2009 14:41:45
Problema Lista lui Andrei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>

using namespace std;

long long a[27][27],w[27][27],c[27][27],n,m;

void copiere(long long a[27][27],long long w[27][27])
{
    for (long long i=1; i<=26; i++)
        for (long long j=1; j<=26; j++)
            w[i][j]=a[i][j];
}

void inmultire(long long a[27][27], long long b[27][27], long long c[27][27])
{
    long long d[27][27];
    for (long long i=1; i<=26; i++)
        for (long long j=1; j<=26; j++)
        {
            d[i][j]=0;
            for (long long k=1; k<=26; k++)
                d[i][j]+=a[i][k]*b[k][j];
        }
    copiere(d,w);
}

void inm_log(long long i,long long w[27][27])
{
    if (i==1)
        copiere(a,w);
    else
    if (i%2==0)
    {
        inm_log(i/2,w);
        inmultire(w,w,w);
    }
    else
    {
        inm_log(i-1,w);
        inmultire(a,w,w);
    }
}

void citire()
{
    char x,y;
    for (long long i=1; i<=26; i++)
        for (long long j=1; j<=26; j++)
            a[i][j]=1;
    freopen("nrcuv.in","r",stdin);
    scanf("%lld %lld\n", &n, &m);
    for (long long i=0; i<m; i++)
    {
        scanf("%c %c\n", &x, &y);
        a[x-'a'+1][y-'a'+1]=a[y-'a'+1][x-'a'+1]=0;
    }
}

int main()
{
    freopen("nrcuv.out","w",stdout);
    citire();
    inm_log(n-1,w);
    long long s=0;
    for (long long i=1; i<=26; i++)
        for (long long j=1; j<=26; j++)
            s+=w[i][j];
    printf("%lld\n",s);
    return 0;
}