牛客春招刷题训练营 - 2025.5.8 题解

活动地址:牛客春招刷题训练营 - 编程打卡活动

Easy 墙壁划线

简要题意

有一个 块大小为 的小矩形组成的大矩形,求大矩形两条对角线与小矩形边的交点数。

Solution

首先,主对角线与反对角线上点数一致,我们只考虑主对角线上的点数,最后考虑二者交点是否在边上即可。

对于主对角线, 的答案

,有 ,此时

中存在偶数时,两条对角线交点在小矩形边上,此时要再将答案减去一。

Code

void R()
{
	int a,b,x,y;
	cin>>a>>b>>x>>y;
	cout<<(a+b-gcd(a,b))*2+((a&1)&&(b&1))+1;
	return;
}

Medium 小红的排列构造

简要题意

构造排列 ,使得 不是质数,或报告无解。

Solution

关键是大于 的偶数都是合数。

,显然是无解的。

,直接取 即可。

,令 ,然后转化为上者处理即可。

Code

void R()
{
	int n;
	cin>>n;

	if (n<3)
	{
		cout<<-1;
		return;
	}

	vector<int> a(n);
	iota(a.begin(),a.end(),1);
	reverse(a.begin(),a.end()-(n%2==0));
	for (int i=0;i<n;i++)
		cout<<a[i]<<" \n"[i+1==n];
	return;
}

Hard

简要题意

求长度不超过 ,且包含子序列 ab 的小写字符串个数。

Solution

简单数学题。

先考虑长度恰好为 的方案数。

正难则反,我们考虑不含子序列 ab 的小写字符串数,再用 减去即可。

首先,不含 a,b 的串有 中,只含 a 或只含 b 的串各有 种,它们显然都不含子序列 ab

考虑同时含有 a,b 的串,要令其不含子序列 ab,则需要所有 a 都出现在串的最后一个 b 之后。

我们枚举最后一个 b 的位置 ,此时方案数则为

则长度恰好为 的方案数为

,我们要求的答案就是 ,即两个等比数列与一个等差乘等比数列求和。

由高中知识易得,对 ,其中

时间复杂度 ,瓶颈在于求幂。

下面的代码实现中使用的 MInt 具体实现见此处

Code

constexpr int P=1e9+7;
using Z=MInt<P>;

void R()
{
	int n;
	cin>>n;

	auto S=[&](Z a,Z b,Z q)->Z
	{
		Z A=a/(q-1),B=(b-A)/(q-1);
		return (A*n+B)*power(q,n)-B;
	};

	cout<<S(0,1,26)*26-S(0,1,25)*25-S(1,0,25);
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务