Codeforces Round #663 (Div. 2)比赛中做出的三题

题意场

萌新认识到了手速的可怕。

c题有一个坑,ab又怂担心不是真的水题,这场真的打炸了。

A. Suborrays

传送门:https://codeforces.ml/contest/1391/problem/A

题意:给你一个n,让你写出一个n的排列,要求任意选一段长度,长度内的数按位或运算大于等于这个长度。

解法:似乎你怎么输出这个排列都可以,只要这真的是个排列

代码:

#include
using namespace std;
typedef long long ll;
void rlmn()
{
	int n;
	scanf("%d",&n);
	for (int i=n;i>=1;i--)
	{
		printf("%d ",i);
	}
	printf("\n");
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)rlmn();
	return 0;
}

B. Fix You

题意:给你一个字符矩阵,R代表向右,D代表向下。(n,m)处有一个收球处C,球可能在字符矩阵的任何位置,要求必须滚到C处,请问最少要改几个字母。

解法:遍历右边缘和下边缘,右边缘看R,下边缘看D即可。

代码:

#include
using namespace std;
typedef long long ll;
char a[205][205];
void rlmn()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i=0;i

C. Cyclic Permutations

题意:定义排列为一个图。每个数为一个点。在每个数两边各找一个比它大但是最靠近的数,将这两个点用无向边连起来。如果这个图有环,就认为是好排列。请问给的n有多少好排列?因为这个数很大,请mod1e9+7.

解法:找递推关系。3的时候是2.然后4的时候相当于把3的数字全部+1,然后填一个1进去。1如果放在头尾的话不会影响,因此是2*a_(n-1)。放在中间,必定能成环,因此是(n-1)!*(n-2)。

因此an=2*a_(n-1)+(n-1)!*(n-2)

不需要空间,直接递推走到n就可以了。

代码:

#include
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
void rlmn()
{
	ll n;
	scanf("%lld",&n);
	ll jie=6;
	ll ans=2;
	for (ll i=4;i<=n;i++)
	{
		ans=(2*ans)%mod+(jie*(i-2))%mod;
		jie=jie*i%mod;
	}
	printf("%lld",ans%mod);
}
int main()
{
	int T;
	T=1;
	while(T--)rlmn();
	return 0;
}

 

你可能感兴趣的:(算法训练,codeforces)