嘤嘤嘤

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82832759

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
#define ll long long
#define mn 111111
using namespace std;
ll n,m,s,t,d[55],a[mn],p[55],f[55][mn][2],c[55][mn];
inline ll calc(ll x) 
{
	ll i,j,k,q,z,t=0;
    memset(f,0,sizeof(f)); f[0][0][0]=1;
    for (i=0;i<m;i++) 
	for (k=0;k<2;k++) 
	{
        q=d[i]; z=0;
        for (j=0;j<=n;j++) 
		{
            if (f[i][j][k]) 
			{
                if ((s&p[i])&&(q&1)||!(s&p[i])&&!(q&1)) 
				if (!(x&p[i])&&k) f[i+1][z][1]+=f[i][j][k]; else f[i+1][z][0]+=f[i][j][k];
				
                if ((s&p[i])&&((n-q)&1)||!(s&p[i])&&!((n-q)&1)) 
                if ((x&p[i])&&!k) f[i+1][z+q][0]+=f[i][j][k]; else f[i+1][z+q][1]+=f[i][j][k];
    
            }
            if (i&&j<n) if (a[c[i-1][j+1]]&p[i]) z++,q--; else q++;
        }
	}
    for (i=0;i<=n;i++) t+=f[m][i][0];
    return t;
}
int main()
{
	ll i,j,z,q;
    scanf("%lld%lld%lld%lld",&n,&m,&s,&t); z=s;
    for (i=1;i<=n;i++) scanf("%lld",a+i),z^=a[i];
    p[0]=1; for (i=1;i<=m+1;i++) p[i]=p[i-1]*2;
    for (j=0;j<m;j++) 
	{
        for (i=1;i<=n;i++) d[j]+=(a[i]&p[j])>0;
        if (j) 
		{
            q=0;
            for (i=1;i<=n;i++) if (a[c[j-1][i]]&p[j]) c[j][++q]=c[j-1][i]; for (i=1;i<=n;i++) if (!(a[c[j-1][i]]&p[j])) c[j][++q]=c[j-1][i]; 
        } 
		else 
		{
            q=0;
            for (i=1;i<=n;i++) if (a[i]&1) c[j][++q]=i; for (i=1;i<=n;i++) if (!(a[i]&1)) c[j][++q]=i;
        }
    } 
    printf("%lld",t/p[m]*calc(p[m]-1)+calc(t%p[m])-(z==0));
} 

来源:zr

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/82832759
今日推荐