【JZOJ5034】B 题解

题目出自吉大附中 jkxing

题目大意

这里写图片描述

       k ≤ n ≤ 50 ~~~~~~k \leq n \leq 50       kn50,方案数 % 998244353

题解

       ~~~~~~       这个题很妙。。。

       ~~~~~~       我们知道矩阵树定理,即基尔霍夫矩阵的任意一个 n − 1 n-1 n1 阶主子式就是生成树个数。
       ~~~~~~       现在加了个限制,即原图的边最多不选 k k k 个,怎么做呢?

       ~~~~~~       其实就是要把原图边和非原图边用不同的方法表示。
       ~~~~~~       比如用 x x x 表示一条原图边,用 1 1 1 表示非原图边。这里的 x x x 是多项式的一次未知数的意思。
       ~~~~~~       比如有个点连了 3 3 3 条原图边、 2 2 2 条非原图边,那么它的度数就是 3 x + 2 3x+2 3x+2。相应地,邻接矩阵里也是用 x x x 1 1 1 来表示。
       ~~~~~~       那么此时的主子式就是一个多项式,其中 x i x^i xi 的系数就表示保留 i i i 条原图边的方案数。

       ~~~~~~       现在的问题是如何把这个多项式求出来。可以用插值法的思想,给 x x x 代入 n n n 个不同的值,最后再插值求多项式。可以用拉格朗日插值法什么的。我用的是 DFT。

代码

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

typedef long long LL;

const int maxn=55, maxlen=150;
const LL mo=998244353;

int n,K,len;
bool mp[maxn][maxn];
LL G0[maxn][maxn][2];

LL mi(LL x,LL y)
{
	LL re=1;
	for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo;
	return re;
}

LL G[maxn][maxn],w[maxlen];
LL Determinant(int n)
{
	LL d=1;
	fo(i,0,n)
	{
		fo(j,i,n) if (G[j][i]>0)
		{
			swap(G[i],G[j]);
			if (j!=i) d*=-1;
			break;
		}
		fo(j,i+1,n)
		{
			LL c=(-G[j][i]*mi(G[i][i],mo-2)%mo+mo)%mo;
			fo(k,0,n) G[j][k]=(G[j][k]+c*G[i][k])%mo;
		}
	}
	fo(i,0,n) d=d*G[i][i]%mo;
	return (d%mo+mo)%mo;
}

LL y[maxlen];
int main()
{
	scanf("%d %d",&n,&K);
	K=n-1-K;
	if (n==1) {printf("1\n"); return 0;}
	for(len=1; len<n; len<<=1);
	fo(i,1,n-1)
	{
		int x;
		scanf("%d",&x);
		G0[x][x][1]++, G0[i][i][1]++;
		G0[x][i][1]--, G0[i][x][1]--;
		mp[x][i]=mp[i][x]=1;
	}
	fo(i,0,n-2)
		fo(j,i+1,n-1) if (!mp[i][j])
		{
			G0[i][i][0]++, G0[j][j][0]++;
			G0[i][j][0]--, G0[j][i][0]--;
		}
	
	w[0]=1;
	w[1]=mi(3,(mo-1)/len);
	fo(i,2,len) w[i]=(w[i-1]*w[1])%mo;
	
	fo(wi,0,len-1)
	{
		fo(i,0,n-1)
			fo(j,0,n-1) G[i][j]=((G0[i][j][0]+G0[i][j][1]*w[wi])%mo+mo)%mo;
		y[wi]=Determinant(n-2);
	}
	
	LL ans=0;
	fo(i,K,len-1)
		fo(j,0,len-1) ans=(ans+y[j]*mi(w[len-i],j))%mo;
	
	printf("%lld\n",ans*mi(len,mo-2)%mo);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2021美赛B题的解题思路涉及城市停车问题。题目要求团队设计一个动态减少停车问题的拦截策略,并使用模型分析其效果。 首先,团队需要构建一个数学模型,以了解停车场的情况和车辆流量。这可以通过搜集数据、观察现实场景和收集停车场使用情况等方式获得。然后,团队应该确定一个目标函数,例如最大化停车收入或最小化剩余停车位。此外,还需要考虑一些限制条件,如停车场的大小、车位的数量和停车收费标准等。 接下来,团队可以考虑使用线性规划和整数规划等方法,以优化停车场的运作。通过解决数学模型,团队可以确定最佳的拦截策略。其中,团队可以考虑选择合适的车辆进入停车场或拦截一些车辆以腾出空位。 除了数学模型的建立和优化,团队还可以使用离散事件仿真等方法进行模拟实验。通过模拟,团队可以测试不同的拦截策略并评估其效果。此外,在模拟实验中,团队还可以考虑不同的场景和参数,以获得更全面的结果。 最后,团队需要根据模型分析和实验结果,对拦截策略进行调整和改进。如果模型和实验都表明拦截策略不理想,团队还可以尝试其他方法,如增加停车位数量或改变停车收费标准等。 总之,2021美赛B题的解题思路包括:构建数学模型、优化模型、使用模拟实验进行评估,并根据模型分析和实验结果进行调整和改进。这种综合运用数学建模和实验分析的方法,可以帮助团队有效解决城市停车问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值