QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#301920#5827. 异或图cryozwq30 78ms75716kbC++144.1kb2024-01-10 14:26:122024-01-10 14:26:12

Judging History

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

  • [2024-01-10 14:26:12]
  • 评测
  • 测评结果:30
  • 用时:78ms
  • 内存:75716kb
  • [2024-01-10 14:26:12]
  • 提交

answer

#include<bits/stdc++.h>
#define mp make_pair
#define fr first
#define sc second
using namespace std;
typedef long long ll;
const ll mod=998244353;
const ll inv2=(mod+1)/2ll;
const int maxn=4e6+5;
const int maxS=(1<<20)+5;
bool con[maxS];
bool g[20][20];
ll lm[20];
ll lim[20];
int n,m;
ll c;
ll f[20][2][2],a[20];
ll ipw[maxn];
ll calc(ll *l,int N,ll C){
    ll ans=0;
    for(ll i=59;i>=0;i--){
    	for(int j=1;j<=N;j++){
            for(int a=0;a<=1;a++){
                for(int b=0;b<=1;b++){
                    f[j][a][b]=0;
                }
            }
        }
        f[0][0][0]=1;
        for(int j=1;j<=N;j++){
            if((l[j]&(1ll<<i))){
                ll s1=((1ll<<i))%mod,s2=(l[j]-s1)%mod;
                f[j][0][0]=f[j-1][0][1]*s2%mod;
                f[j][0][1]=f[j-1][0][0]*s2%mod;
                f[j][1][0]=(f[j-1][0][0]*s1%mod+f[j-1][1][1]*s2%mod+f[j-1][1][0]*s1%mod)%mod;
                f[j][1][1]=(f[j-1][0][1]*s1%mod+f[j-1][1][0]*s2%mod+f[j-1][1][1]*s1%mod)%mod;
            }
            else{
                for(int a=0;a<=1;a++){
                    for(int b=0;b<=1;b++){
                        f[j][a][b]=f[j-1][a][b]*(l[j]%mod)%mod;
                    }
                }
            }
        }
    	if((C&(1ll<<i)))ans=(ans+f[N][1][1]*ipw[i]%mod)%mod;
        else ans=(ans+f[N][1][0]*ipw[i]%mod)%mod;
    	int cnt=0;
        for(int j=1;j<=N;j++){
            if((l[j]&(1ll<<i))){
                cnt++;
                l[j]^=(1ll<<i);
            }
        }
        if(((cnt&1)^((C>>i&1))))return ans;
    }
    return ans;
}
#define lowbit(i) ((i)&(-(i)))
ll dp[maxS],pw[maxn],xs[maxn];
int ch[maxS],lg[maxS];
int popcnt[maxn];
int id[maxn];
pair<ll,int>tmp[maxn];
int main(){
    ipw[0]=1;
    for(int i=1;i<maxn;i++)ipw[i]=ipw[i-1]*inv2%mod;
    pw[0]=1;
    for(int i=1;i<maxn;i++)pw[i]=pw[i-1]*3ll%mod;
    for(int i=1;i<maxS;i++)ch[i]=ch[i>>1]*3ll+(i&1),popcnt[i]=popcnt[i>>1]+(i&1);
    for(int i=1;(1<<(i-1))<maxS;i++)lg[(1<<i-1)]=i;
    scanf("%d%d%lld",&n,&m,&c);
    for(int i=1;i<=n;i++)scanf("%lld",&lim[i]),lim[i]++,tmp[i]=mp(lim[i],i);
    sort(tmp+1,tmp+n+1);
    sort(lim+1,lim+n+1);
    if(m==0){
        cout<<calc(lim,n,c)<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++)id[tmp[i].sc]=i;
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        g[id[u]][id[v]]=g[id[v]][id[u]]=1;
    }
    for(int S=0;S<(1<<n);S++){
        for(int i=1;i<=n;i++){
            if(!(S&(1<<i-1)))continue;
            for(int j=1;j<=n;j++){
                if(!(S&(1<<j-1)))continue;
                if(i==j)continue;
                if(g[i][j])con[S]=1;
            }
        }
    }
    for(int S=1;S<(1<<n);S++){
    	xs[S]=0;        
        if(!con[S])xs[S]=1;
        int ts=(S^(lowbit(S)));
    	for(int T=ts;T;T=((T-1)&ts)){ 
    		if(!con[T])xs[S]=(xs[S]-xs[S^T]+mod)%mod;
    	}
        // cout<<S<<" "<<xs[S]<<endl;
    }
    dp[0]=1;
    int cnt=0;
    int all=(1<<n)-1;
    for(int S=0;S<pw[n];S++){
        if(!dp[S])continue;
        // if(2000<=S&&S<=2500)cout<<S<<" "<<dp[S]<<endl;
        int ts=0,T=S;
        for(int i=n-1;i>=0;i--){
            if(T>=pw[i]){
                ts+=(1<<i); 
                T%=pw[i];
            } 
        }
        ts=(all^ts);
        if(!ts)continue;
        int tts=(ts^(lowbit(ts)));
        // cout<<S<<" "<<tts<<endl;
        for(int tt=tts;;tt=((tt-1)&tts)){ 
            int T=(tt|(lowbit(ts)));
    		int news=S+ch[T];
            if(popcnt[T]&1){
                news+=ch[lowbit(ts)];
                dp[news]=(dp[news]+dp[S]*xs[T]%mod)%mod;
            }
            else{
                dp[news]=(dp[news]+dp[S]*xs[T]%mod*(lim[lg[lowbit(ts)]]%mod)%mod)%mod;
            } 
            if(!tt)break;
        }
    }
    ll ans=0;
    for(int S=0;S<(1<<n);S++){
        int ts=ch[S]+ch[all];
        if(!dp[ts])continue;
        int tt=0;
        for(int i=1;i<=n;i++){
            if((S&(1<<i-1)))lm[++tt]=lim[i];
        }
        ans=(ans+dp[ts]*calc(lm,tt,c)%mod)%mod;
    }
    cout<<ans;
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 20
Accepted

Test #1:

score: 20
Accepted
time: 39ms
memory: 74284kb

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: 27ms
memory: 74252kb

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: 35ms
memory: 74496kb

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: 23ms
memory: 74200kb

input:

4 0 4
9 8 5 2

output:

148

result:

ok 1 number(s): "148"

Test #5:

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

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: 31ms
memory: 74280kb

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: 34ms
memory: 74320kb

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: 39ms
memory: 74488kb

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: 37ms
memory: 74388kb

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: 33ms
memory: 74200kb

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: 27ms
memory: 74276kb

input:

3 0 3
15 7 12

output:

104

result:

ok 1 number(s): "104"

Test #12:

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

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: 27ms
memory: 74288kb

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: 23ms
memory: 74268kb

input:

5 0 12
9 8 14 11 2

output:

3006

result:

ok 1 number(s): "3006"

Test #15:

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

input:

3 1 1
6 10 4
3 1

output:

30

result:

ok 1 number(s): "30"

Subtask #2:

score: 0
Wrong Answer

Dependency #1:

100%
Accepted

Test #16:

score: 50
Accepted
time: 27ms
memory: 74392kb

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: 31ms
memory: 74344kb

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: 43ms
memory: 74292kb

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: 31ms
memory: 75716kb

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: 34ms
memory: 75188kb

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: 21ms
memory: 74504kb

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
Wrong Answer
time: 78ms
memory: 75392kb

input:

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

output:

443917653

result:

wrong answer 1st numbers differ - expected: '504321097', found: '443917653'

Subtask #3:

score: 10
Accepted

Test #47:

score: 10
Accepted
time: 38ms
memory: 74380kb

input:

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

output:

231790380

result:

ok 1 number(s): "231790380"

Test #48:

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

input:

11 0 101435837408688522
638776638580507479 933944392115323974 19098604312360490 142362319980029593 419910251764515410 275591812677260089 770239593400917018 928344484461634421 67340905784404712 378109786925249078 110881245457449811

output:

242383534

result:

ok 1 number(s): "242383534"

Test #49:

score: 0
Accepted
time: 25ms
memory: 74256kb

input:

9 0 100988561775675251
622570387572403506 684352103903274038 784649864569409753 270298495621205212 56183537059869110 346856482529145989 86639702870530669 607198038565138736 14747634008501988

output:

20893166

result:

ok 1 number(s): "20893166"

Test #50:

score: 0
Accepted
time: 50ms
memory: 74256kb

input:

10 0 839910859917247463
611237879350518457 292219463776059962 548211857317940894 822255554598388425 335628456629874391 774414280870858683 882480367082748768 654587410087321403 74330774886125511 22894883233341926

output:

61697734

result:

ok 1 number(s): "61697734"

Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%