题意场
萌新认识到了手速的可怕。
c题有一个坑,ab又怂担心不是真的水题,这场真的打炸了。
A. Suborrays
传送门:https://codeforces.ml/contest/1391/problem/A
题意:给你一个n,让你写出一个n的排列,要求任意选一段长度,长度内的数按位或运算大于等于这个长度。
解法:似乎你怎么输出这个排列都可以,只要这真的是个排列
代码:
#include<bits/stdc++.h>
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<bits/stdc++.h>
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<n;i++)
{
scanf("%s",a[i]);
}
int ans=0;
for (int i=0;i<n;i++)
{
if (a[i][m-1]=='R')
ans++;
}
for (int i=0;i<m;i++)
{
if (a[n-1][i]=='D')
ans++;
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)rlmn();
return 0;
}
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<bits/stdc++.h>
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;
}