QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#297792#5827. 异或图chenxinyang200620 956ms10948kbC++149.6kb2024-01-05 10:23:552024-01-05 10:23:56

Judging History

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

  • [2024-01-05 10:23:56]
  • 评测
  • 测评结果:20
  • 用时:956ms
  • 内存:10948kb
  • [2024-01-05 10:23:55]
  • 提交

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;
ll inst;
ll a[25];
Z fact[25],ifac[25],inv[25];
int ord[25],rk[25];

bool cmp(int x,int y){
    return a[x] > a[y];
}
int msk[25],_sum[1 << 15];

Z val[3][16][1 << 15],_ret[1 << 15];
void FWT(Z *f){
    rep(i,0,n - 1){
        rep(S,0,(1 << n) - 1) if((S >> i) & 1) f[S] += f[S - (1 << i)];
    }
}

void iFWT(Z *f){
    rep(i,0,n - 1){
        rep(S,0,(1 << n) - 1) if((S >> i) & 1) f[S] -= f[S - (1 << i)];
    }
}
Z tmp[3][25];
void ln(Z *f,Z *g){//f = ln g
    fill(f,f + n + 1,0);
    rep(i,0,n - 1){
        f[i + 1] = (i + 1) * g[i + 1];
        rep(j,0,i - 1) f[i + 1] -= (j + 1) * f[j + 1] * g[i - j];
        f[i + 1] *= inv[i + 1];
    }
}

void Exp(Z *g,Z *f){//g = e^f
    fill(g,g + n + 1,0);
    g[0] = 1;
    rep(i,0,n - 1){
        rep(j,0,i) g[i + 1] += (j + 1) * f[j + 1] * g[i - j];
        g[i + 1] *= inv[i + 1];
    }
}

void conv(Z *f,Z *g,Z *res,int k){//size 是 2^k
    rep(i,0,k){
        fill(val[0][i],val[0][i] + (1 << k),0);
        fill(val[1][i],val[1][i] + (1 << k),0);
    }
    rep(S,0,(1 << k) - 1){
        val[0][popcnt(S)][S] += f[S];
        val[1][popcnt(S)][S] += g[S];
    }
    rep(i,0,k){
        FWT(val[0][i]);
        FWT(val[1][i]);
    }
    rep(S,0,(1 << k) - 1){
        rep(i,0,k){
            tmp[0][i] = val[0][i][S];
            tmp[1][i] = val[1][i][S];
            tmp[2][i] = 0;
        }
        rep(i,0,k){
            rep(j,0,k - i) tmp[2][i + j] += tmp[0][i] * tmp[1][j];
        }
        rep(i,0,k) val[2][i][S] = tmp[2][i];
    }
    rep(i,0,k) iFWT(val[2][i]);
    rep(S,0,(1 << k) - 1) res[S] = val[2][popcnt(S)][S];
}
Z dp[1 << 15],ndp[1 << 15],A[1 << 15],B[1 << 15],C[1 << 15];

Z _dp[2][2],_ndp[2][2],b[25];
Z calc(int S){
//    printf("solve S=%d\n",S);
    Z ans = 0;
    int qwq;
    per(p,59,0){
        _dp[0][0] = 1;_dp[0][1] = _dp[1][0] = _dp[1][1] = 0;
        rep(i,0,n - 1) b[i] = (a[i] & ((1ll << p) - 1)) + 1;
        qwq = 0;
        rep(i,0,n - 1){
            if(!((S >> i) & 1)) continue;

            if((a[i] >> p) & 1){
                rep(v,0,1){
                    _ndp[v][1] += _dp[v][1] * (1ll << p) + _dp[v][0];
                    _ndp[v ^ 1][1] += _dp[v][1] * b[i];
                    _ndp[v ^ 1][0] += _dp[v][0] * b[i];
                }
                qwq ^= 1;
            }else{
                rep(v,0,1){
                    _ndp[v][1] += _dp[v][1] * b[i];
                    _ndp[v][0] += _dp[v][0] * b[i];
                }
            }
            rep(v,0,1){
                rep(o,0,1){
                    _dp[v][o] = _ndp[v][o];
                    _ndp[v][o] = 0;
                }
            }
        }
        ans += _dp[(inst >> p) & 1][1];
        if(qwq != ((inst >> p) & 1)) break;
        if(!p) ans++;
    }
//    printf("%d\n",ans.val());
    return ans;
}

int main(){
//    freopen("test.in","r",stdin);
//    freopen("test.out","w",stdout);
    scanf("%d%d%lld",&n,&m,&inst);
    fact[0] = 1;
    rep(i,1,n) fact[i] = fact[i - 1] * i;
    ifac[n] = Z(1) / fact[n];
    per(i,n - 1,0) ifac[i] = ifac[i + 1] * (i + 1);
    rep(i,1,n) inv[i] = ifac[i] * fact[i - 1];

    rep(u,0,n - 1){
        scanf("%lld",&a[u]);
        ord[u] = u;
    }
    sort(ord,ord + n,cmp);
    rep(i,0,n - 1) rk[ord[i]] = i;
    sort(a,a + n);reverse(a,a + n);
    rep(i,1,m){
        int u,v;
        scanf("%d%d",&u,&v);
        u = rk[u - 1];v = rk[v - 1];
        msk[u] |= 1 << v;msk[v] |= 1 << u;
    }
    rep(S,1,(1 << n) - 1){
        int u = ctz(S);
        _sum[S] = _sum[S - (1 << u)] + popcnt(msk[u] & S);
    }
//    rep(S,0,(1 << n) - 1) printf("S=%d:%d\n",S,_sum[S]);
    rep(S,0,(1 << n) - 1) if(!_sum[S]) val[0][popcnt(S)][S]++;
    rep(i,0,n) FWT(val[0][i]);
    rep(S,0,(1 << n) - 1){
//        printf("S=%d\n",S);
        rep(i,0,n) tmp[1][i] = val[0][i][S];
//        rep(i,0,n) printf("%d ",tmp[1][i].val());
//        printf("\n");
        ln(tmp[0],tmp[1]);
//        rep(i,0,n) printf("%d ",tmp[0][i].val());
//        printf("\n");
        rep(i,0,n) val[1][i][S] = tmp[0][i];
    }
    rep(i,0,n) iFWT(val[1][i]);
    rep(S,0,(1 << n) - 1) _ret[S] = val[1][popcnt(S)][S];
//    printf("ret:\n");
//    rep(S,0,(1 << n) - 1) printf("S=%d:%d\n",S,_ret[S].val());
    rep(i,0,n) fill(val[0][i],val[0][i] + (1 << n),0);
    rep(S,1,(1 << n) - 1) if(!__builtin_parity(S)) val[0][popcnt(S)][S] += _ret[S] * (a[__lg(S)] + 1);
//    rep(S,0,(1 << n) - 1) printf("S=%d:%d\n",S,val[0][popcnt(S)][S].val());
    rep(i,0,n) FWT(val[0][i]);
    rep(S,0,(1 << n) - 1){
//        printf("%d:\n",S);
        rep(i,0,n) tmp[1][i] = val[0][i][S];
        Exp(tmp[0],tmp[1]);
/*        rep(i,0,n) printf("%d ",tmp[1][i].val());
        printf("\n");
        rep(i,0,n) printf("%d ",tmp[0][i].val());
        printf("\n");*/
        rep(i,0,n) val[1][i][S] = tmp[0][i];
    }
    rep(i,0,n) iFWT(val[1][i]);

    rep(S,0,(1 << n) - 1) dp[(1 << n) - 1 - S] = val[1][popcnt(S)][S];
    dp[(1 << n) - 1] = 1;
//    rep(S,0,(1 << n) - 1) printf("%d ",dp[S].val());
//    printf("\n");

    per(pos,n - 1,0){
//        printf("pos=%d\n",pos);
        int s = pos + 1;
        rep(P,0,(1 << (n - pos - 1)) - 1){
            fill(A,A + (1 << s),0);fill(B,B + (1 << s),0);fill(C,C + (1 << s),0);
            rep(S,0,(1 << s) - 1){
                if((S >> pos) & 1){
                    A[(1 << s) - 1 - S] += dp[(P << s) | S];
                    if(__builtin_parity(S)) B[S] += _ret[S];
                }
            }
/*            printf("P=%d\n",P);
            rep(S,0,(1 << s) - 1) printf("%d ",A[S].val());
            printf("\n");
            rep(S,0,(1 << s) - 1) printf("%d ",B[S].val());
            printf("\n");*/
            conv(A,B,C,s);
//            rep(S,0,(1 << s) - 1) printf("%d ",C[S].val());
//            printf("\n");  
            rep(S,0,(1 << s) - 1){
                if((S >> pos) & 1) ndp[(P << s) + (1 << (pos + 1)) - 1 - S + (1 << pos)] += C[S];
                else ndp[(P << s) | S] += dp[(P << s) | S];
            }
        }
        rep(S,0,(1 << n) - 1){
            dp[S] = ndp[S];
            ndp[S] = 0;
//            printf("%d ",dp[S].val());
        }
//        printf("\n");
    }
/*    printf("final:\n");
    rep(S,0,(1 << n) - 1){
        rep(i,0,n - 1) printf("%d",(S >> i) & 1);
        printf(" %d\n",dp[S].val());
    }
    printf("\n");*/
    Z ans = 0;
    rep(S,0,(1 << n) - 1) ans += dp[S] * calc(S);
    printf("%d\n",ans.val());
	return 0;
}

詳細信息

Subtask #1:

score: 20
Accepted

Test #1:

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

input:

4 6 2
7 11 14 0
1 2
1 3
2 3
2 4
4 1
4 3

output:

44

result:

ok 1 number(s): "44"

Test #2:

score: 0
Accepted
time: 3ms
memory: 10640kb

input:

4 4 6
12 14 14 5
4 2
1 4
3 2
1 2

output:

798

result:

ok 1 number(s): "798"

Test #3:

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

input:

3 3 2
10 4 11
2 1
3 2
1 3

output:

33

result:

ok 1 number(s): "33"

Test #4:

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

input:

4 0 4
9 8 5 2

output:

148

result:

ok 1 number(s): "148"

Test #5:

score: 0
Accepted
time: 2ms
memory: 10688kb

input:

5 6 14
12 15 13 13 12
3 1
2 4
2 5
2 1
5 3
4 5

output:

21337

result:

ok 1 number(s): "21337"

Test #6:

score: 0
Accepted
time: 2ms
memory: 10680kb

input:

4 5 5
5 2 4 13
2 1
3 4
1 4
4 2
3 2

output:

42

result:

ok 1 number(s): "42"

Test #7:

score: 0
Accepted
time: 2ms
memory: 10692kb

input:

4 4 3
13 7 8 12
4 1
3 1
2 4
4 3

output:

552

result:

ok 1 number(s): "552"

Test #8:

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

input:

4 2 12
1 12 4 11
2 1
3 1

output:

70

result:

ok 1 number(s): "70"

Test #9:

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

input:

5 5 6
10 7 8 2 13
1 5
1 3
2 1
4 3
5 3

output:

1231

result:

ok 1 number(s): "1231"

Test #10:

score: 0
Accepted
time: 2ms
memory: 10640kb

input:

5 7 9
6 7 13 15 12
1 3
5 3
5 2
4 5
4 3
4 1
3 2

output:

6223

result:

ok 1 number(s): "6223"

Test #11:

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

input:

3 0 3
15 7 12

output:

104

result:

ok 1 number(s): "104"

Test #12:

score: 0
Accepted
time: 2ms
memory: 10684kb

input:

3 2 9
10 6 5
1 2
1 3

output:

17

result:

ok 1 number(s): "17"

Test #13:

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

input:

5 5 11
7 9 15 9 9
5 4
5 1
5 2
1 3
3 4

output:

5224

result:

ok 1 number(s): "5224"

Test #14:

score: 0
Accepted
time: 2ms
memory: 10764kb

input:

5 0 12
9 8 14 11 2

output:

3006

result:

ok 1 number(s): "3006"

Test #15:

score: 0
Accepted
time: 2ms
memory: 10708kb

input:

3 1 1
6 10 4
3 1

output:

30

result:

ok 1 number(s): "30"

Subtask #2:

score: 0
Time Limit Exceeded

Dependency #1:

100%
Accepted

Test #16:

score: 50
Accepted
time: 10ms
memory: 10708kb

input:

9 27 705410105529944560
929827299070190972 733413770730537329 473007347105710981 190062421504120247 918561152768663129 196040702922254016 981530663192980241 203295856357272834 337150461958783092
2 8
7 9
8 9
2 3
9 2
2 7
9 5
9 4
4 8
1 7
6 3
6 1
4 1
6 5
2 4
2 1
9 3
9 6
7 3
7 5
5 2
4 5
2 6
3 1
3 8
4 3
8 6

output:

5392583

result:

ok 1 number(s): "5392583"

Test #17:

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

input:

9 7 788762650337246371
605340092851479114 625896945107761227 361131331380167081 572133549445050458 929899192003968010 340514051531987427 690728985364969400 268762741220048006 818120252827139346
5 8
9 6
6 1
1 9
9 8
5 1
4 5

output:

35237078

result:

ok 1 number(s): "35237078"

Test #18:

score: 0
Accepted
time: 2ms
memory: 10712kb

input:

7 8 968166787047166534
945734997493219809 465616677643913237 530128109571749460 717120283671096308 118646732725835921 510958884109370001 797022604947155276
5 2
4 7
1 2
6 5
4 2
4 6
1 6
6 3

output:

133871438

result:

ok 1 number(s): "133871438"

Test #19:

score: 0
Accepted
time: 956ms
memory: 10772kb

input:

12 21 341964498832651322
422448536649714733 488538974423366199 893293448611252565 879334133559023407 13516625885288091 43377983230712374 263189254162337644 474056776923289355 540904774976211471 103364876621830299 515157013276720499 213857038587555252
12 9
8 3
1 9
1 7
3 1
8 11
11 10
6 10
6 1
10 2
7 9...

output:

296076062

result:

ok 1 number(s): "296076062"

Test #20:

score: 0
Accepted
time: 218ms
memory: 10712kb

input:

11 42 215284372701527433
670445786006000260 969876209382224733 248721347029697734 375741447316879814 840434941395805804 187091598433077755 126574401069916039 764298539206353847 750906714570719526 387387869969339518 713140316419888823
1 10
2 5
1 7
4 11
3 11
2 7
4 5
9 5
1 6
3 4
10 9
11 9
3 7
2 1
8 11
...

output:

861118590

result:

ok 1 number(s): "861118590"

Test #21:

score: 0
Accepted
time: 3ms
memory: 10756kb

input:

7 20 619868500075052677
653541655679358091 619279335581334164 74945438024390700 772996180610853550 636253173293891586 125935970032544337 454311587629767538
7 3
4 5
6 7
2 7
4 2
5 3
4 6
2 6
7 4
5 7
2 5
6 3
5 1
2 3
3 4
1 7
2 1
1 3
5 6
4 1

output:

396474896

result:

ok 1 number(s): "396474896"

Test #22:

score: -50
Time Limit Exceeded

input:

13 1 655058659126783551
220930961455414900 363602338013759573 443737606888655227 137555247528320912 492558319379424931 930253239754276705 727679308735300884 787033056632957722 29595553176095069 586820353385061840 342786039873677428 141912073483259823 800159879032310691
4 9

output:


result:


Subtask #3:

score: 0
Time Limit Exceeded

Test #47:

score: 0
Time Limit Exceeded

input:

14 0 731833687287532167
157552918690640051 900457311668526045 111217720157614956 84140984111060473 814012186135880499 784848789620248379 958953377683017264 105083874298571687 104921429970878846 44983041675142735 871013110538758030 686733907990421995 98063590462078176 495161493555059993

output:


result:


Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%