Codeforces 388D Fox and Perfect Sets

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yzyyylx/article/details/82862391

题面

题意

一个集合如果是完美的,则集合如果包含a,b,那么a^b也一定在这个集合内,求所有最大数小于等于n的集合数量。

做法

对于完美集合,我们可以发现一个线性基一定对应一个合法的完美集合,因此我们可以对线性基进行数位dp,因为一个完美集合可以对应多种线性基,所以可以通过高斯消元使其唯一,也就是说,对于一个经过高斯消元的线性基的每一位,如果它是某个基的最高位,则只有那一个基的这一位为1,反之任何最高位大于这一位的基的这一位可以为任意数(满足最大值小于等于n时),且所有基的异或值即为这个线性基所能表示的最大值。
因此可以进行数位dp,dp[i][j][k]表示当前考虑的位为第i位,已经选了j个基,k表示其是否受k的性质。

当不受n的限制时,即无论后面几位怎么样,其最大值都不会大于n:
若添加以i为最高位的基时,dp[i][j][0]可以转移到dp[i-1][j+1][0],且只有一种转移方式,因为前j个基的这一位都是0.
若不添加以i为最高位的基时,dp[i][j][0]可以转移到dp[i-1][j][0],且有(1 << j)种转移方式,因为前j个基的这一位可以为任意数.

当受到n的限制时:
如果n的第i位为0:
显然不能添加以i位最高位的基,否则异或值必将大于n,而且前j个基的这一位不能随便选,要保证前j位的异或值的第i位为0,即前j个基种一共有偶数个基的这一位是1,这可以用组合数去算,也就是说dp[i][j][1]可以转化到dp[i-1][j][1],有F(j,0)种转移方式。
F(j,0)=C(j,0)+C(j,2)+C(j,4)…

如果n的第i位为1:
若添加以i这一位为最高位的基,则同理,仅一种转移:dp[i][j][1]转移到dp[i-1][j+1][1]
若不添加,则有以下两种情况:
1.前j位中,第i位为1的数一共有偶数个时,则最大值的第i位一定为0,此线性基的最大值一定小于n,因此dp[i][j][1]可以转移到dp[i-1][j][0],有F(j,0)中转移方式。
2.前j位中,第i位为1的数一共有奇数个时,则最大值的第i位为1,此线性基的前j+1位仍然与n相同,其最大值不一定小于n,故dp[i][j][1]可以转移到dp[i-1][j][1],有F(j,1)中转移方式。
F(j,1)=C(j,1)+C(j,3)+C(j,5)…

代码

#include<iostream>
#include<cstdio>
#define ll long long
#define N 40
#define M 1000000007
using namespace std;

ll n,m,C[N][N],cnt[N][2],dp[N][N][2],ans;

inline void add(ll &u,ll v)
{
	u+=v;
	u%=M;
}

int main()
{
	ll i,j;
	cin>>n;
	for(i=1;i<=n;i<<=1,m++);
	for(i=0; i<=m; i++)
	{
		C[i][0]=C[i][i]=1;
		for(j=1; j<i; j++)
		{
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%M;
		}
		for(j=0; j<=i; j++)
		{
			add(cnt[i][j&1],C[i][j]);
		}
	}
	
	dp[m][0][1]=1;
	for(i=m; i>=1; i--)
	{
		for(j=0; j<=m; j++)
		{
			add(dp[i-1][j][0],dp[i][j][0]*(1 << j)%M);
			add(dp[i-1][j+1][0],dp[i][j][0]);
			if((1 << (i-1))&n)
			{
				add(dp[i-1][j][0],dp[i][j][1]*cnt[j][0]%M);
				add(dp[i-1][j][1],dp[i][j][1]*cnt[j][1]%M);
				add(dp[i-1][j+1][1],dp[i][j][1]);
			}
			else add(dp[i-1][j][1],dp[i][j][1]*cnt[j][0]%M);
		}
	}
	
	for(i=0; i<=m; i++)
	{
		add(ans,dp[0][i][0]+dp[0][i][1]);
	}
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/yzyyylx/article/details/82862391