답안 #987351

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
987351 2024-05-22T15:51:20 Z alexdd Semafor (COI20_semafor) C++17
39 / 100
805 ms 1784 KB
#include<iostream>
#include<map>
using namespace std;
#define int long long
const long long MOD = 1e9+7;
struct matrix
{
    int v[105][105];
};
matrix inm(matrix x, matrix y)
{
    matrix aux;
    for(int i=0;i<100;i++)
    {
        for(int j=0;j<100;j++)
        {
            aux.v[i][j]=0;
            for(int k=0;k<100;k++)
            {
                aux.v[i][j] += 1LL*x.v[i][k] * y.v[k][j]%MOD;
                aux.v[i][j]%=MOD;
            }
        }
    }
    return aux;
}
matrix unu;
matrix put(matrix a, int exp)
{
    matrix aux=unu;
    while(exp>0)
    {
        if(exp%2==1) aux = inm(aux,a);
        a = inm(a,a);
        exp/=2;
    }
    return aux;
}
int m;
map<pair<int,int>,pair<int,bool>> mp;
long long dp[12][1505];

long long put_nr(long long a, int exp)
{
    if(exp==0)
        return 1;
    if(exp%2==0)
        return put_nr(a*a%MOD,exp/2);
    else
        return put_nr(a*a%MOD,exp/2)*a%MOD;
}
long long fact[3005],invf[3005];
long long comb(int x, int y)
{
    if(x<y)
        return 0;
    return ((((fact[x]*invf[y])%MOD)*invf[x-y])%MOD);
}
int calc(int cnt1, int k)
{
    dp[0][0]=1;
    for(int i=1;i<=cnt1;i++)
    {
        for(int nr=0;nr<=k;nr++)
        {
            dp[i][nr]=0;
            for(int cur=1;cur<=nr;cur+=2)
            {
                dp[i][nr] += dp[i-1][nr-cur] * comb(nr,cur);
                dp[i][nr]%=MOD;
            }
        }
    }
    for(int i=cnt1+1;i<=10;i++)
    {
        for(int nr=0;nr<=k;nr++)
        {
            dp[i][nr]=0;
            for(int cur=0;cur<=nr;cur+=2)
            {
                dp[i][nr] += dp[i-1][nr-cur] * comb(nr,cur);
                dp[i][nr]%=MOD;
            }
        }
    }
    return dp[10][k];
}
int getmp(int config, int k)
{
    int cnt1=0;
    for(int i=0;i<10;i++)
        if(((1<<i)&config))
            cnt1++;
    if(mp[{cnt1,k}].second==0)
    {
        mp[{cnt1,k}]={calc(cnt1,k),1};
    }
    return mp[{cnt1,k}].first;
}
int mask[100];
matrix calc_matrix(int k)
{
    matrix aux;
    for(int i=0;i<100;i++)
    {
        for(int j=0;j<100;j++)
        {
            aux.v[i][j] = getmp((mask[i]^mask[j]),k);
        }
    }
    return aux;
}
void calc_mask()
{
    mask[0] = (1<<1) + (1<<3);
    mask[1] = (1<<1);
    mask[2] = (1<<0) + (1<<3);
    mask[3] = (1<<0) + (1<<1) + (1<<2);
    mask[4] = (1<<1) + (1<<4);
    mask[5] = (1<<0) + (1<<2) + (1<<4);
    mask[6] = (1<<2) + (1<<3);
    mask[7] = (1<<0) + (1<<1);
    mask[8] = (1<<0) + (1<<2) + (1<<3) + (1<<4);
    mask[9] = (1<<0) + (1<<1) + (1<<2) + (1<<4);
    for(int i=10;i<100;i++)
    {
        mask[i] = (mask[i/10]<<5) + mask[i%10];
    }
    for(int i=9;i>=0;i--)
        mask[i] += (mask[0]<<5);
}
signed main()
{
    for(int i=0;i<100;i++)
        for(int j=0;j<100;j++)
            unu.v[i][j]=0;
    for(int i=0;i<100;i++)
        unu.v[i][i]=1;

    fact[0]=1;
    for(int i=1;i<=3000;i++)
        fact[i]=fact[i-1]*i%MOD;
    invf[3000]=put_nr(fact[3000],MOD-2);
    for(int i=2999;i>=0;i--)
        invf[i]=invf[i+1]*(i+1)%MOD;

    int n,k,x;
    cin>>m>>n>>k>>x;
    calc_mask();
    matrix km = calc_matrix(k);
    matrix rm = calc_matrix(n%k);
    matrix rez=unu;
    if(n/k > 0) rez = inm(rez,put(km,n/k));
    if(n%k > 0) rez = inm(rez,rm);

    //if(n==k) rez=km;

    for(int i=0;i<100;i++)
    {
        cout<<rez.v[x][i]<<"\n";
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 1368 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 1368 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1372 KB Output is correct
2 Correct 14 ms 1264 KB Output is correct
3 Correct 146 ms 1356 KB Output is correct
4 Correct 193 ms 1360 KB Output is correct
5 Correct 191 ms 1356 KB Output is correct
6 Correct 238 ms 1352 KB Output is correct
7 Correct 310 ms 1588 KB Output is correct
8 Correct 307 ms 1364 KB Output is correct
9 Correct 177 ms 1356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 1372 KB Output is correct
2 Correct 147 ms 1368 KB Output is correct
3 Correct 229 ms 1372 KB Output is correct
4 Correct 290 ms 1612 KB Output is correct
5 Correct 273 ms 1372 KB Output is correct
6 Correct 264 ms 1616 KB Output is correct
7 Correct 280 ms 1372 KB Output is correct
8 Correct 265 ms 1368 KB Output is correct
9 Correct 266 ms 1368 KB Output is correct
10 Correct 263 ms 1372 KB Output is correct
11 Correct 35 ms 1372 KB Output is correct
12 Correct 17 ms 1372 KB Output is correct
13 Correct 277 ms 1372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 1372 KB Output is correct
2 Correct 147 ms 1368 KB Output is correct
3 Correct 229 ms 1372 KB Output is correct
4 Correct 290 ms 1612 KB Output is correct
5 Correct 273 ms 1372 KB Output is correct
6 Correct 264 ms 1616 KB Output is correct
7 Correct 280 ms 1372 KB Output is correct
8 Correct 265 ms 1368 KB Output is correct
9 Correct 266 ms 1368 KB Output is correct
10 Correct 263 ms 1372 KB Output is correct
11 Correct 35 ms 1372 KB Output is correct
12 Correct 17 ms 1372 KB Output is correct
13 Correct 277 ms 1372 KB Output is correct
14 Correct 101 ms 1356 KB Output is correct
15 Correct 413 ms 1356 KB Output is correct
16 Correct 426 ms 1360 KB Output is correct
17 Correct 482 ms 1368 KB Output is correct
18 Correct 362 ms 1336 KB Output is correct
19 Correct 343 ms 1616 KB Output is correct
20 Correct 345 ms 1616 KB Output is correct
21 Correct 267 ms 1368 KB Output is correct
22 Correct 274 ms 1372 KB Output is correct
23 Correct 396 ms 1264 KB Output is correct
24 Correct 805 ms 1452 KB Output is correct
25 Correct 665 ms 1444 KB Output is correct
26 Correct 24 ms 1368 KB Output is correct
27 Correct 31 ms 1372 KB Output is correct
28 Correct 523 ms 1444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1372 KB Output is correct
2 Correct 14 ms 1264 KB Output is correct
3 Correct 146 ms 1356 KB Output is correct
4 Correct 193 ms 1360 KB Output is correct
5 Correct 191 ms 1356 KB Output is correct
6 Correct 238 ms 1352 KB Output is correct
7 Correct 310 ms 1588 KB Output is correct
8 Correct 307 ms 1364 KB Output is correct
9 Correct 177 ms 1356 KB Output is correct
10 Correct 61 ms 1372 KB Output is correct
11 Correct 147 ms 1368 KB Output is correct
12 Correct 229 ms 1372 KB Output is correct
13 Correct 290 ms 1612 KB Output is correct
14 Correct 273 ms 1372 KB Output is correct
15 Correct 264 ms 1616 KB Output is correct
16 Correct 280 ms 1372 KB Output is correct
17 Correct 265 ms 1368 KB Output is correct
18 Correct 266 ms 1368 KB Output is correct
19 Correct 263 ms 1372 KB Output is correct
20 Correct 35 ms 1372 KB Output is correct
21 Correct 17 ms 1372 KB Output is correct
22 Correct 277 ms 1372 KB Output is correct
23 Correct 101 ms 1356 KB Output is correct
24 Correct 413 ms 1356 KB Output is correct
25 Correct 426 ms 1360 KB Output is correct
26 Correct 482 ms 1368 KB Output is correct
27 Correct 362 ms 1336 KB Output is correct
28 Correct 343 ms 1616 KB Output is correct
29 Correct 345 ms 1616 KB Output is correct
30 Correct 267 ms 1368 KB Output is correct
31 Correct 274 ms 1372 KB Output is correct
32 Correct 396 ms 1264 KB Output is correct
33 Correct 805 ms 1452 KB Output is correct
34 Correct 665 ms 1444 KB Output is correct
35 Correct 24 ms 1368 KB Output is correct
36 Correct 31 ms 1372 KB Output is correct
37 Correct 523 ms 1444 KB Output is correct
38 Runtime error 160 ms 1784 KB Execution killed with signal 11
39 Halted 0 ms 0 KB -