QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#354733#6344. The Best Problem of 2021chenxinyang2006AC ✓74ms4496kbC++147.0kb2024-03-15 22:04:062024-03-15 22:04:07

Judging History

你现在查看的是最新测评结果

  • [2024-03-15 22:04:07]
  • 评测
  • 测评结果:AC
  • 用时:74ms
  • 内存:4496kb
  • [2024-03-15 22:04:06]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;

template <class T>
void chkmax(T &x,T y){
    if(x < y) x = y;
}

template <class T>
void chkmin(T &x,T y){
    if(x > y) x = y;
}

inline int popcnt(int x){
    return __builtin_popcount(x);
}

inline int ctz(int x){
    return __builtin_ctz(x);
}

template <int P>
class mod_int
{
    using Z = mod_int;

private:
    static int mo(int x) { return x < 0 ? x + P : x; }

public:
    int x;
    int val() const { return x; }
    mod_int() : x(0) {}
    template <class T>
    mod_int(const T &x_) : x(x_ >= 0 && x_ < P ? static_cast<int>(x_) : mo(static_cast<int>(x_ % P))) {}
    bool operator==(const Z &rhs) const { return x == rhs.x; }
    bool operator!=(const Z &rhs) const { return x != rhs.x; }
    Z operator-() const { return Z(x ? P - x : 0); }
    Z pow(long long k) const
    {
        Z res = 1, t = *this;
        while (k)
        {
            if (k & 1)
                res *= t;
            if (k >>= 1)
                t *= t;
        }
        return res;
    }
    Z &operator++()
    {
        x < P - 1 ? ++x : x = 0;
        return *this;
    }
    Z &operator--()
    {
        x ? --x : x = P - 1;
        return *this;
    }
    Z operator++(int)
    {
        Z ret = x;
        x < P - 1 ? ++x : x = 0;
        return ret;
    }
    Z operator--(int)
    {
        Z ret = x;
        x ? --x : x = P - 1;
        return ret;
    }
    Z inv() const { return pow(P - 2); }
    Z &operator+=(const Z &rhs)
    {
        (x += rhs.x) >= P && (x -= P);
        return *this;
    }
    Z &operator-=(const Z &rhs)
    {
        (x -= rhs.x) < 0 && (x += P);
        return *this;
    }
    Z operator-()
    {
        return -x;
    }
    Z &operator*=(const Z &rhs)
    {
        x = 1ULL * x * rhs.x % P;
        return *this;
    }
    Z &operator/=(const Z &rhs) { return *this *= rhs.inv(); }
#define setO(T, o)                                  \
    friend T operator o(const Z &lhs, const Z &rhs) \
    {                                               \
        Z res = lhs;                                \
        return res o## = rhs;                       \
    }
    setO(Z, +) setO(Z, -) setO(Z, *) setO(Z, /)
#undef setO
    
    friend istream& operator>>(istream& is, mod_int& x)
    {
        long long tmp;
        is >> tmp;
        x = tmp;
        return is;
    }
    friend ostream& operator<<(ostream& os, const mod_int& x)
    {
        os << x.val();
        return os;
    }
};

using Z = mod_int<mod>;
Z power(Z p,ll k){
    Z ans = 1;
    while(k){
        if(k % 2 == 1) ans *= p;
        p *= p;
        k /= 2;
    }
    return ans;
}
int n,m;
bitset <2005> w[2005],cur,X;
char str[2005];

void ins(){
    rep(i,1,m){
        if(!cur.test(i)) continue;
        if(!w[i].test(i)){
            w[i] = cur;
            return;
        }
        cur ^= w[i];
    }
    printf("0\n");
    exit(0);
}

void add(int p){
//    printf("add %d\n",p);
    while(X.test(p)){
        X.reset(p);
        p++;
    }
    X.set(p);
}
Z val[2005],qfact[2005],qifac[2005],P[2005];
void init(){
    P[0] = 1;
    rep(i,1,n) P[i] = P[i - 1] + P[i - 1];
    qfact[0] = 1;
    rep(i,1,n) qfact[i] = qfact[i - 1] * (P[i] - 1);
    qifac[n] = Z(1) / qfact[n];
    per(i,n - 1,0) qifac[i] = qifac[i + 1] * (P[i + 1] - 1);
/*    rep(i,1,n) printf("%d ",qfact[i].val());
    printf("\n");
    rep(i,1,n) printf("%d ",qifac[i].val());
    printf("\n");*/
}

Z C2(int N,int M){
    if(N < M || M < 0) return 0;
    return qfact[N] * qifac[M] * qifac[N - M];
}

const Z i2 = Z(1) / 2;
Z res[2005],dp[2][2005],ndp[2][2005];
void solve(){
    dp[0][0] = dp[1][0] = 1;
    rep(i,1,n){
        if(!X.test(i)){
            //10 pattern
            rep(j,0,i - 1){
                ndp[0][j] += C2(i - 1,j) * i2;
            }            

            rep(j,0,i - 1){
                //这一位上有
                ndp[0][j + 1] += dp[0][j] * P[i - 1 - j];
                ndp[1][j + 1] += dp[1][j] * P[i - 1 - j];

                //这一位上没有
                ndp[0][j] += dp[0][j] * i2;
                ndp[1][j] += dp[1][j];
            }
        }else{
            //01 pattern
            rep(j,0,i - 1){
                ndp[0][j] += C2(i - 1,j) * i2 * val[j];
                ndp[1][j] += C2(i - 1,j) * val[j];
            }

            rep(j,0,i - 1){
                //这一位上有
                ndp[0][j + 1] += dp[0][j] * P[i - 1 - j] * val[j];
                ndp[1][j + 1] += dp[0][j] * P[i - 1 - j] * val[j];

                //这一位上没有
                ndp[0][j] += dp[0][j] * i2;
            }
        }
//        printf("i=%d\n",i);
        rep(j,0,i){
            dp[0][j] = ndp[0][j];
            dp[1][j] = ndp[1][j];
            ndp[0][j] = ndp[1][j] = 0;
//            printf("[0]%d [1]%d\n",dp[0][j].val(),dp[1][j].val());
        }
    }
    rep(i,0,n) res[i] = dp[1][i];
//    rep(i,0,n) printf("%d ",res[i].val());
//    printf("\n");
}

int main(){
//    freopen("test.in","r",stdin);
//    freopen("test.out","w",stdout);
    scanf("%d%d",&n,&m);
    init();
    rep(i,1,n){
        scanf("%s",str + 1);
        cur.reset();
        rep(j,1,m) if(str[j] == '1') cur.set(j);
        ins();
    }
    ll prd = 1;
    rep(i,0,n){
        val[i] = power(2,prd);
        prd = prd * 2 % (mod - 1);
    }
    scanf("%s",str + 1);
/*    rep(i,1,m){
        rep(j,1,m) printf("%d",w[i].test(j));
        printf("\n");
    }*/
    cur.reset();
    int ssum = n;
    rep(i,1,m){
        if(str[i] == '1' && w[i].test(i)) add(ssum);

        if(cur.test(i) + '0' != str[i]){
            if(w[i].test(i)){
                cur ^= w[i];    
            }else{
                if(!cur.test(i)) add(ssum + 1);
                break;                
            }
        }
        ssum -= w[i].test(i);
        if(i == m) add(1);
    }
//    rep(i,1,n + 1) printf("%d",X.test(i));
//    printf("\n");
    //现在是 1~n 位,但一个 special case 是只有 n+1 位有值,此时相当于问 [0,2^n-1] 取一个子集满秩方案数
    if(X.test(n + 1)) rep(d,0,n) res[d] = C2(n,d) * val[d];
    else solve();
//    rep(d,0,n) printf("%d ",res[d].val());
//    printf("\n");
//    res[1] = 6;
    rep(i,0,n){
        rep(j,0,i - 1) res[i] -= C2(n - j,i - j) * res[j];
    }
//    rep(i,0,n) printf("%d ",res[i].val());
//    printf("\n");
    printf("%d\n",(res[n] / 2).val());
	return 0;
}
/*
00
01
10 选一个子集出来,满秩方案数
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3980kb

input:

4 4
0001
0010
0100
1000
1101

output:

7364

result:

ok 1 number(s): "7364"

Test #2:

score: 0
Accepted
time: 1ms
memory: 3880kb

input:

3 2
00
00
00
11

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3896kb

input:

2 3
110
101
101

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 4000kb

input:

3 10
1111100110
0011110100
0101100001
1110000001

output:

38

result:

ok 1 number(s): "38"

Test #5:

score: 0
Accepted
time: 0ms
memory: 4020kb

input:

7 13
1000101001000
1000000010000
1010101011111
1001100100111
1111111101100
0101010101110
1101100010100
1000010011001

output:

744450298

result:

ok 1 number(s): "744450298"

Test #6:

score: 0
Accepted
time: 1ms
memory: 4004kb

input:

100 100
1111010111010001011111110010101001001101000000000000011000001100101000100011100011000000110000001010
1001001110111010100100010111100010111110101100101000010111001011111010111100111000000011101010100111
000011010111000100110100010010011101001111100110111000100101010001101100101011000111101101...

output:

19562313

result:

ok 1 number(s): "19562313"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3928kb

input:

400 500
1011011011010010111110101001010011000100001111000111111111001111100010101011110011010010011100100100111111000111001110111100101010000000100100011011011001011100100000000100001100001010100010111000110011000100101001010110110100110101000011011011011100111110010100101000011001100000001100001000...

output:

681985268

result:

ok 1 number(s): "681985268"

Test #8:

score: 0
Accepted
time: 23ms
memory: 4128kb

input:

999 1997
011101110101100100111101100000000100001110010001010100011010111010101101011100001000010001110100110111101101010111010011101111011001011100110110101011111011000111101011011000010101100101001110000111010101111100000100100101110000111001010101110110000001111111100110110011110100101000011100011...

output:

435150194

result:

ok 1 number(s): "435150194"

Test #9:

score: 0
Accepted
time: 61ms
memory: 4348kb

input:

1901 2000
10000111000111010000000000100110001100110010011001101110001011000001011000010111101110111001111000010110110100010100010101011111011101100111010101010001010010111010001011000001011010100011000101101010001110111100000101110110011001101111101111000100001010011101011110001100110001100000111110...

output:

9254020

result:

ok 1 number(s): "9254020"

Test #10:

score: 0
Accepted
time: 74ms
memory: 4484kb

input:

1984 2000
11111101001011101001011011010011000001100000101000001001111000100010011011000110110110100000001100000000001111101001111010111110000000010000000111111001010111101101110000111110010111001011011111010010110001011100110101000110000100010100100101010111101100000011110010010100101011101001110110...

output:

870006511

result:

ok 1 number(s): "870006511"

Test #11:

score: 0
Accepted
time: 27ms
memory: 4412kb

input:

2000 2000
00010001100000101100000110010101010101110010001000000100010010110010001100110000001110100111010110100110101010101111011100001110100011001000010001000011100111010100110101000111010010010111001001101100100000101001111111001111101001000101001011101001010010010101011110111001101101101001001000...

output:

0

result:

ok 1 number(s): "0"

Test #12:

score: 0
Accepted
time: 1ms
memory: 3980kb

input:

11 11
10000000000
01000000000
00100000000
00010000000
00001000000
00000100000
00000010000
00000001000
00000000100
00000000010
00000000001
10111110000

output:

312889397

result:

ok 1 number(s): "312889397"

Test #13:

score: 0
Accepted
time: 1ms
memory: 3856kb

input:

100 100
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

554554135

result:

ok 1 number(s): "554554135"

Test #14:

score: 0
Accepted
time: 10ms
memory: 4084kb

input:

1000 1000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

944188930

result:

ok 1 number(s): "944188930"

Test #15:

score: 0
Accepted
time: 39ms
memory: 4440kb

input:

1999 1999
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

753324940

result:

ok 1 number(s): "753324940"

Test #16:

score: 0
Accepted
time: 35ms
memory: 4408kb

input:

2000 2000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

489943678

result:

ok 1 number(s): "489943678"

Test #17:

score: 0
Accepted
time: 39ms
memory: 4496kb

input:

2000 2000
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

458543942

result:

ok 1 number(s): "458543942"

Test #18:

score: 0
Accepted
time: 0ms
memory: 3884kb

input:

37 100
0000000000100000010101011000010111111000000000000000000000000000000000001110100110101000000010110000
0111100011011110101011110100101001011000000000110010001010110100000000010000100000111011000000100000
0001110011110000001100011000010011001000000000000000000000000000000000000000000000000000010...

output:

807297668

result:

ok 1 number(s): "807297668"

Test #19:

score: 0
Accepted
time: 1ms
memory: 3996kb

input:

71 93
100010100111111001011100000000011001101101010001011001110001101110010000001000001000000000011
110100111110010001000110000101111010111111000111011010100001010000010110011000000100000000000
110010010110000000010001010100000011000100000010011100100000100100101100010100001100000010000
000101010010...

output:

50935767

result:

ok 1 number(s): "50935767"

Test #20:

score: 0
Accepted
time: 1ms
memory: 3944kb

input:

101 114
010101111101011101100001000100001001000100011100111111110010001111101001100100000110100101010110000000000000001000
101010000011100100000001100000110000111001111011000010010101001011110110100101011101111111111110111010000000000000
11011100100101010100101100000101100000010100000010010110101010...

output:

0

result:

ok 1 number(s): "0"

Test #21:

score: 0
Accepted
time: 1ms
memory: 3896kb

input:

17 2000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010101111100001010111000001111010110101100011000011011111110001011001011010111110111110000110011101111011010110101011010100110001111110110110101000101110100110011001000010000001010...

output:

526829746

result:

ok 1 number(s): "526829746"

Test #22:

score: 0
Accepted
time: 1ms
memory: 3928kb

input:

30 1999
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

708057099

result:

ok 1 number(s): "708057099"

Test #23:

score: 0
Accepted
time: 1ms
memory: 4000kb

input:

54 2000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

output:

0

result:

ok 1 number(s): "0"

Test #24:

score: 0
Accepted
time: 9ms
memory: 4316kb

input:

791 1999
101011000010100101111110010001001001000000000001111100001000101100011110001010010011111110111010100011111010001110000001100010000011001110110011011011110110101100010010110111011000101111010100101110110010100011100100011001100000000001000001010100000000100111011000101111100100001000011010001...

output:

64451741

result:

ok 1 number(s): "64451741"

Test #25:

score: 0
Accepted
time: 20ms
memory: 4268kb

input:

944 2000
110101011100010000001010011011000001001001101001001011101110100000001000000010101011111001101010110100011101110100110010110000011100011111000001011110100111011101110010100100110111001110110001101010011101100010100100000010110101000101111000101110011000111000111111101110001101101110111110001...

output:

996119909

result:

ok 1 number(s): "996119909"

Test #26:

score: 0
Accepted
time: 26ms
memory: 4228kb

input:

1102 1999
10001010010010110101001000110000010000000110101001010111100100000110001111111100111001000111000111110100101101010110111110110001111011110101111001101100101110001011100001100000000000111111111000111010000111100010011010100001001011110111011110100001000100111000100001000010111001111011110001...

output:

855516290

result:

ok 1 number(s): "855516290"

Test #27:

score: 0
Accepted
time: 37ms
memory: 4384kb

input:

1931 2000
01101111100011101110100101000110011110000111000001010001011111010110011001111110110010111000100010111101001100001100001100010101000011001000110001011101111001000111101011011100011110010100001111111000101111000110000000000010110101110001000001011111001000001001100110101100100010101010010000...

output:

0

result:

ok 1 number(s): "0"

Test #28:

score: 0
Accepted
time: 63ms
memory: 4332kb

input:

1944 1999
10000110101111110110111101101000111110100010000011101101000011101100110000110001110000100000100101011111100100111000100110011111110111011100100000111000101110011100101011000011101101010001111110110100101101001011010011111111011111001101010000101011110010010110110101110000000111010100111101...

output:

52786402

result:

ok 1 number(s): "52786402"

Test #29:

score: 0
Accepted
time: 39ms
memory: 4312kb

input:

1977 2000
10011110110110110011001100011011011110111110001001101000101110100111011100011101001100100101110101010001100011001110111011101101100010000010100010001011011011001111011010111011100010101010101111101100001000111011100010111000000101111110100001111011111111111111110101101001101001111100011100...

output:

0

result:

ok 1 number(s): "0"

Test #30:

score: 0
Accepted
time: 45ms
memory: 4436kb

input:

2000 2000
01110010111000111001110000110111011110010010111001000001100101101011000001010111111010001100110000101001001000000000011001101101010001010011010000111011111101001110110010110101110101100100000011110100100010110001110010101001000110100100001001001111000111001011110110101100101011011011101010...

output:

3964016

result:

ok 1 number(s): "3964016"

Test #31:

score: 0
Accepted
time: 38ms
memory: 4448kb

input:

1994 1999
00001100011011001011110111100001111001010110101100010010111001011000100111011110000010100111100001101101100000101111101111001001011001000111111011010110001111001100110000100001101001011001001011100101000101010000110001101000100110110010011010000001000110001010101101111100010110001010101000...

output:

0

result:

ok 1 number(s): "0"

Test #32:

score: 0
Accepted
time: 38ms
memory: 4308kb

input:

1997 2000
01111000101001101011000100101111110000011100111100101100111100110000100101010001011110111100101000001001000110100110111101011101010100010110101011010010000100000110011111100000100011000110001110000111011010110001001001000001110101011011011000101111010000010101101111110100110011110100101000...

output:

0

result:

ok 1 number(s): "0"

Test #33:

score: 0
Accepted
time: 63ms
memory: 4496kb

input:

2000 2000
00110111110110101110100001011000000101001011010011111001100000001001101100111111100001100010111101001110101001101010111011111000000110101101101110100111110101111110010000001001010100111101011010100000010001110100100010010100101010100110011101011110111100111110101110111010010111010010100010...

output:

385756366

result:

ok 1 number(s): "385756366"

Test #34:

score: 0
Accepted
time: 62ms
memory: 4368kb

input:

1988 1999
10101010110010100000101100110010001110101111010010001011010100100010101111001010100110100101100100111101000001000110001011110000001110000000110000001111000100101100000000111011011011110111101000001110111111000110011011111011010000010011100010010110111010000011010001011100010001011001100000...

output:

534584509

result:

ok 1 number(s): "534584509"

Test #35:

score: 0
Accepted
time: 67ms
memory: 4364kb

input:

2000 2000
00100000011001010111100000100001011101010011001010100100100001100000000100010110000110010111010000100110010000010001110100010100111001000110111001011101101110111000000111000000111101011010000110010011110011010000010101000111100100100001101001100010101101011111001010001011101001100001011010...

output:

0

result:

ok 1 number(s): "0"

Test #36:

score: 0
Accepted
time: 38ms
memory: 4420kb

input:

1995 2000
10010000010101100111011100110001101101000100010011110100110111110000000111010000111101011000101000111000010010010111000010101110110100011100111010110110110100111101010100000110001010010001011001000100011110101100110111010110101010100100011010101100001010111111000100101110001101000000010010...

output:

0

result:

ok 1 number(s): "0"

Test #37:

score: 0
Accepted
time: 68ms
memory: 4452kb

input:

1999 1999
11011110110011001100010110011001000101010101001001010101111111000111100000001101101101101010001111010000011101100110100111011010011011001101010011001100011111010100001000100100100111010111001000000010101100100010001111100100101110100010010010101000000110101011101001110010111111011101000101...

output:

678369480

result:

ok 1 number(s): "678369480"

Test #38:

score: 0
Accepted
time: 35ms
memory: 4436kb

input:

1999 2000
11000110010001011100111010011110110100101101000010111101001010100000100100011101011000110000101011011111110101001101111010010010010001011110101001010000010100110110100110011110011101001100000001110100001100110111011001110000110110000101110011110010110100110011010111011001011010111000000110...

output:

0

result:

ok 1 number(s): "0"