Cod sursa(job #277055)

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

using namespace std;

int a[27][27],w[27][27],n,m;

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

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

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

void citire()
{
    char x,y;
    for (int i=1; i<=26; i++)
        for (int j=1; j<=26; j++)
            a[i][j]=1;
    freopen("nrcuv.in","r",stdin);
    scanf("%d %d\n", &n, &m);
    for (int 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);
    long long s=0;
    for (int i=1; i<=26; i++)
        for (int j=1; j<=26; j++)
            s+=w[i][j];
    printf("%lld\n",s);
    return 0;
}