| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 987509 | activedeltorre | Semafor (COI20_semafor) | C++14 | 666 ms | 1364 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
using namespace std;
long long nr1[2300];
long long nr2[2300];
long long biti=5;
long long nmax=9;
long long cif(long long val)
{
    if(val==1)
    {
        return 1;
    }
    else if(val==2)
    {
        return 6;
    }
    else if(val==3)
    {
        return 21;
    }
    else if(val==4)
    {
        return 9;
    }
    else if(val==5)
    {
        return 28;
    }
    else if(val==6)
    {
        return 18;
    }
    else if(val==7)
    {
        return 5;
    }
    else if(val==8)
    {
        return 30;
    }
    else if(val==9)
    {
        return 29;
    }
    else
        return 3;
}
long long getid(long long val)
{
    if(biti==5)
        return cif(val/10)*0+cif(val%10);
    else
         return cif(val/10)*32+cif(val%10);
}
long long mod=1e9+7;
struct kuk
{
    long long mat[105][105];
}m1,m2,m3;
kuk mini;
kuk mini2;
kuk base1,base2;
kuk rasp;
void multi(kuk a,kuk b)
{
    long long i,z,j;
    for(i=0;i<=nmax;i++)
    {
        for(j=0;j<=nmax;j++)
        {
            rasp.mat[i][j]=0;
        }
    }
    for(i=0;i<=nmax;i++)
    {
        for(j=0;j<=nmax;j++)
        {
            for(z=0;z<=nmax;z++)
            {
                rasp.mat[i][j]+=(a.mat[i][z]*b.mat[z][j])%mod;
            }
        }
    }
    for(i=0;i<=nmax;i++)
    {
        for(j=0;j<=nmax;j++)
        {
            rasp.mat[i][j]%=mod;
        }
    }
}
long long invs(long long a,long long exp)
{
    long long prod=1;
    while(exp)
    {
        if(exp%2==1)
        {
            prod=(prod*a)%mod;
        }
        exp=exp/2;
        a=(a*a)%mod;
    }
    return prod;
}
long long differ(long long a,long long b)
{
    return __builtin_popcount(getid(a)^getid(b));
}
long long invsc[25][25];
void precalc()
{
    long long i,j,z;
    for(i=1;i<=20;i++)
    {
        for(j=0;j<=i;j++)
        {
            long long prod=1;
            for(z=1;z<=i;z++)
            {
                prod=(prod*invs(z,mod-2))%mod;
            }
            for(z=1;z<=j;z++)
            {
                prod=(prod*z)%mod;
            }
            for(z=1;z<=i-j;z++)
            {
                prod=(prod*z)%mod;
            }
            invsc[i][j]=prod;
        }
    }
}
long long anticomb(long long x)
{
    return invsc[biti][x];
}
kuk base;
kuk afis;
kuk bigmat;
kuk bigmat2;
void calcbigger()
{
    for(long long i=0;i<=nmax;i++)
    {
        for(long long j=0;j<=nmax;j++)
        {
            bigmat.mat[i][j]=(base.mat[0][differ(i,j)]*anticomb(differ(j,i))%mod);
        }
    }
}
signed main()
{
    long long n,i,j,k,l,m,st,val,z;
    cin>>m>>n>>k>>st;
    if(m==2)
    {
        nmax=99;
        biti=10;
    }
    else
    {
        nmax=9;
        biti=5;
    }
    precalc();
    val=getid(st);
    nr1[val]=1;
    base.mat[0][0]=1;
    base2.mat[0][0]=1;
    for(i=0;i<=biti;i++)
    {
        if(i<biti)
        mini.mat[i][i+1]=(biti-i);
        if(i>=1)
        mini.mat[i][i-1]=i;
    }
    mini2=mini;
    long long k2=k;
    while(k)
    {
        if(k%2==1)
        {
            multi(base,mini);
            base=rasp;
        }
        multi(mini,mini);
        mini=rasp;
        k=k/2;
    }
    long long operbig=n/k2;
    long long opersmall=n%k2;
    while(opersmall)
    {
        if(opersmall%2==1)
        {
            multi(base2,mini2);
            base2=rasp;
        }
        multi(mini2,mini2);
        mini2=rasp;
        opersmall=opersmall/2;
    }
    for(i=0;i<=nmax;i++)
    {
        for(j=0;j<=nmax;j++)
        {
            bigmat2.mat[i][j]=(base2.mat[0][differ(i,j)]*anticomb(differ(i,j))%mod);
        }
    }
    afis.mat[st][st]=1;
    calcbigger();
    while(operbig)
    {
        if(operbig%2==1)
        {
            multi(afis,bigmat);
            afis=rasp;
        }
        operbig=operbig/2;
        multi(bigmat,bigmat);
        bigmat=rasp;
    }
    multi(afis,bigmat2);
    afis=rasp;
    for(i=0;i<=nmax;i++)
    {
        cout<<afis.mat[st][i]<<'\n';
    }
    return 0;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
