Educational Codeforces Round 83 (ABCD)


Educational Codeforces Round 83 (Rated for Div. 2)


前言


比賽AC


A. Two Regular Polygons

簡明題意

  • t組樣例,每次給出nm(m<=n),問你正m邊形的頂點是否能完全與正n邊形重合

正文

  • 頂點完全重合的充要條件是m|n。只需要一次簡單的判斷就可以了。
  • 原因:直接在n邊形上取點,我們可以選擇每隔一個點取一個,隔兩個,隔三個,隔k個…如果隔若干個點剛好能取到,那麼n/k就是取到的點數,反過來就是直接判斷是否有m|n

代碼


B. Bogosort

簡明題意

  • 給定n長的數組,需要你重新剛給這個數組排列,使得對任意的i,j,有i<jjajiaii<j且j-a_j\not=i-a_i

正文

  • 注意到ij是升序的,現在有aiia_i-i,那麼把a數組降序排列就可以了,這樣可以使得aiia_i-i升序,就不會有相等的了。

代碼

略。


C. Adding Powers

簡明題意

  • 有一個n長的數組,給你一個k,現在有無限多個整數i(i>=0),你每次可以讓數組的任意一位+=kik^i(但相同的i只能用一次)
  • 現在給你一個數組和k,問你這個數組能不能由上面的方法構造出來。

正文

  • 看見kik^i應該立馬想到k進制了。那麼我們可以直接把數組中的每一項都轉換成k進制數,然後需要滿足1個條件:
  • 1.所有的kik^i中的i都應該不一樣。這個直接數組判一下就行。
  • 滿足了這個就yes,否則就no。

代碼

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#include<map>
#include<queue>
#include<string>
#include<vector>
using namespace std;

const int maxn = 100;

void solve()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n, k;
		int rec[100] = { 0 };
		cin >> n >> k;

		bool ok = 1;
		for (int i = 1; i <= n; i++)
		{
			long long t;
			cin >> t;
			if (!ok) continue;

			int w = 0;
			while (t)
			{
				w++;
				if (t%k == 1)
				{
					if (rec[w] == 1)
					{
						ok = 0;
						break;
					}
					else rec[w] = 1;
				}
				else if (t%k >= 2)
				{
					ok = 0;
					break;
				}
				t /= k;
			}
		}
		cout << (ok ? "YES" : "NO") << endl;
	}
}

int main()
{
	//freopen("Testin.txt", "r", stdin);
	solve();
	return 0;
}

賽後補題


D. Count the Arrays

簡明題意

  • 計數題。計算滿足某些要求的序列的數量。
  • 1.含有n個元素
  • 2.每個元素的大小在[1,m]
  • 3.這n個元素中只有兩個是相同的,其他互相都不同
  • 4.存在一個i使得i前面的元素比它小,i後面的元素也比它小(嚴格小)

正文

  • 因爲有兩個數是相同的,所以滿足要求的序列中,一定含有n-1個不同的元素。因此我們從先從m個數中選出n-1個,就是Cmn1C_{m}^{n-1 }
  • 再選一個數作爲重複數,共有n-1種數,除了最大值不能重複,其他數都能重複,也就是有n-2種重複法。
  • 最後,數都選好了,我們要確定順序。現在確定了n個數,這n箇中有1個最大數,有2個重複數,剩下n-3個不一樣的數。我們如果給這n-3個數排序,怎麼排序呢?我們要把這n-3個數分成兩部分,第一部分單調增,另一部分單調減,然後把最大數放在中間。剩下的2個相同數的位置就是固定的了。那麼這n-3個數怎麼分成兩部分呢,這個就是Cn30+Cn31++Cn3n3=2n3C_{n-3}^0+C_{n-3}^1+···+C_{n-3}^{n-3}=2^{n-3}
  • 根據乘法原理,把上面的乘起來,答案就是Cmn1(n2)2n3C_m^{n-1}*(n-2)*2^{n-3}

代碼

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#include<map>
#include<queue>
#include<cstdio>	
#include<map>
#include<vector>
#include<string>
using namespace std;

const int maxn = 1e5 + 10;
const int mod = 998244353;

int ksm(int a, int b)
{
	int ans = 1, base = a;
	while (b)
	{
		if (b & 1)
			ans = 1ll * ans * base % mod;
		b >>= 1;
		base = 1ll * base * base % mod;
	}
	return ans;
}

int C(int n, int m)
{
	int ans = 1;
	for (int i = 0; i < m; i++)
		ans = 1ll * ans * (n - i) % mod;

	int b = 1;
	for (int i = 1; i <= m; i++)
		b = 1ll * b * i % mod;

	return 1ll * ans * ksm(b, mod - 2) % mod;
}

void solve()
{
	int n, m;
	cin >> n >> m;
	if (n < 3)
	{
		cout << 0;
		return;
	}
	cout << 1ll * C(m, n - 1) * (n - 2) % mod * ksm(2, n - 3) % mod;
}

int main()
{
	//freopen("testin.txt", "r", stdin);
	solve();
	return 0;
}

簡明題意

正文

代碼


簡明題意

正文

代碼


總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章