Educational Codeforces Round 83 (Rated for Div. 2)

本文详细解析了CodeForces竞赛中的五个题目,包括判断倍数关系、数组倒序输出、加法规则验证、计数特定数组及数组压缩算法。通过代码示例,深入探讨了算法设计与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://codeforces.com/contest/1312

A - Two Regular Polygons

是否倍数

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
int main()
{
	int T;
	sc("%d", &T);
	while (T--)
	{
		int a, b;
		sc("%d%d", &a, &b);
		if (a % b == 0 || b % a == 0)
			pr("YES\n");
		else
			pr("NO\n");
	}
}

B - Bogosort

倒序输出

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
int a[105];
int main()
{
	int T;
	sc("%d", &T);
	while (T--)
	{
		int n;
		sc("%d", &n);
		for (int i = 0; i < n; i++)
			sc("%d", &a[i]);
		sort(a, a + n, greater<int>());
		for (int i = 0; i < n; i++)
			pr("%d%c", a[i], i == n - 1 ? '\n' : ' ');
	}
}

C - Adding Powers

将所有数字转换成 k 进制,每一位只能有一个 1,模拟一下。

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
ll a[105];
bool vis[100];
int main()
{
	int T;
	sc("%d", &T);
	while (T--)
	{
		memset(vis, 0, sizeof(vis));
		int n, k;
		ll cnt = 0;
		sc("%d%d", &n, &k);
		for (int i = 0; i < n; i++)
			sc("%lld", &a[i]);
		for (int i = 0; i < n; i++)
		{
			int cnt = 0;
			while (a[i])
			{
				if (a[i] % k > 1)
				{
					pr("NO\n");
					goto qwe;
				}
				else if (a[i] % k == 1)
				{
					if (vis[cnt] == true)
					{
						pr("NO\n");
						goto qwe;
					}
					vis[cnt] = true;
				}
				cnt++;
				a[i] /= k;
			}
		}
		pr("YES\n");
	qwe:;
	}
}

D - Count the Arrays

从 1-m 中选择 n 个数字构成一个排列,其中只有两个数字是相等的,并且满足先升序再降序(可以没有升序或者降序)

1、考虑先从 m 个数字中选出 n-1 个数字        C_m^{n-1}

2、考虑相等的数字不可能是最大的数字,所以可以取剩下的 n-2 个数字      n-2

3、现在考虑排列,我们将最大的数字固定,分为左右两边,除了两个相同的数字,剩下的数字可以任意选择左边或者右边,所以答案是 \sum_{i=0}^{n-3}C_{n-3}^i,由组合数公式,式子等于 2^{n-3}

所以答案等于 C_m^{n-1}*(n-2)*2^{n-3}

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
const ll mod = 998244353;
const int MAXN = 2e5 + 5;
ll fac[MAXN], inv[MAXN];
void init()
{
	fac[0] = inv[0] = 1;
	fac[1] = inv[1] = 1;
	for (int i = 2; i < MAXN; i++)
	{
		fac[i] = fac[i - 1] * i % mod;
		inv[i] = inv[mod % i] * (ll)(mod - mod / i) % mod;
	}
	for (int i = 2; i < MAXN; i++)
		inv[i] = (inv[i] * inv[i - 1]) % mod;
}
ll C(ll n, ll m)
{
	ll res = fac[n] * inv[m] % mod * inv[n - m] % mod;
	return res;
}
ll power(ll a, ll b)
{
	ll res = 1;
	while (b)
	{
		if (b & 1)
			res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res;
}
int main()
{
	init();
	ll n, m;
	sc("%lld%lld", &n, &m);
	if (n == 2)
	{
		pr("0");
		return 0;
	}
	ll ans = C(m, n - 1);
	ans = ans * (n - 2) % mod;
	ans = ans * power(2, n - 3) % mod;
	pr("%lld\n", ans);
}

E - Array Shrinking

占坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值