Cod sursa(job #3189334)

Utilizator MilitaruMihai2022Millitaru Mihai MilitaruMihai2022 Data 4 ianuarie 2024 21:00:41
Problema Subsir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX=502,MOD=666013;
bool a[NMAX],b[NMAX];
char s1[NMAX],s2[NMAX];
int d[NMAX][NMAX],n,m,p,k;

bool citire()
{
    f.getline(s1,NMAX);
    f.getline(s2,NMAX);
    n=strlen(s1);
    m=strlen(s2);
}

void aflare()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(s1[i-1]==s2[j-1])
            {
                if(a[i]==0 && b[j]==0)
                {
                p++;
                a[i]=1;
                b[j]=1;
                }
                d[i][j]=d[i-1][j-1]+1;
            }
            else
                d[i][j]=max(d[i-1][j],d[i][j-1]);
        }
    }
    k=d[n][m];
}

int powlg(int x,int p)
{
    int v=1;
    while(p>0)
    {
        if(p%2==0)
        {
            x=1LL*x*x%MOD;
            p/=2;
        }
        else
        {
            v=1LL*v*x%MOD;
            p--;
        }
    }
    return v;
}

inline int invMod(int n)
{
    return powlg(n,MOD-2);
}

int comb(int n,int k)
{
    if(k>n-k)
        k=n-k;
    int f=1,c=1;
    for(int i=1;i<=k;i++)
    {
        c=1LL*c*(n-i+1)%MOD;
        f=1LL*f*i%MOD;
    }
    c=1LL*c*invMod(f)%MOD;
    return c;
}

int main()
{
    citire();
    aflare();
    g<<comb(p,k);
    return 0;
}