Codeforces Round #663 (Div. 2)
A
题意
要求给出一个全排列,使得任意的$i<j$,满足$a_i\,\,OR\,\,a_{i+1}...a_{j-1}\,\,OR\,\,a_j \ge j-i+1$。
分析
由于一个数的$OR$肯定不会小于自身,所以只需要按顺序输出就可以了。
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll maxn=2e5+100;
5 const ll mod=1e9+7;
6 ll t,n,m;
7 int main(){
8 //freopen("in.txt","r",stdin);
9 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
10 cin>>t;
11 while(t--){
12 cin>>n;
13 for(int i=1;i<=n;i++) cout<<i<<' ';
14 cout<<endl;
15 }
16 return 0;
17 }
B
题意
给出一个字符矩阵,$R$代表向右走,$D$代表向下走,问至少修改多少个才能对于任意一个起点都能到最右下角。
分析
只要把边界处理好就行。
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll maxn=2e5+100;
5 const ll mod=1e9+7;
6 ll t,n,m;
7 int main(){
8 //freopen("in.txt","r",stdin);
9 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
10 cin>>t;
11 while(t--){
12 cin>>n>>m;
13 ll res=0;
14 char c;
15 for(int i=0;i<n;i++){
16 for(int j=0;j<m;j++){
17 cin>>c;
18 if((j==m-1&&c=='R')||(i==n-1&&c=='D')){
19 res++;
20 }
21 }
22 }
23 cout<<res<<endl;
24 }
25 return 0;
26 }
C
题意
挺多的我就不说了
分析
这个数据量估摸着是递推,对于$a_{n-1}$可以证明在任意位置插入均可,所以先有$n \cdot a_{n-1}$;然后对于之前没有成圈的,只要最终放的位置不是首位或者尾部就可以成圈(别问,问就是碰出来的)。
最终得到递推式:
$$
a_n=\left\{ \begin{array}{c}
2,n=3;\\
\left( n-2 \right) \cdot \left( n-1 \right) !+2a_{n-1},n\ge 4\\
\end{array} \right.
$$
预处理阶乘然后取模即可。
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll maxn=1e6+100;
5 const ll mod=1e9+7;
6 ll t,n,m,jie[maxn];
7 void get(ll n){
8 jie[1]=1;
9 for(int i=2;i<=n;i++){
10 jie[i]=jie[i-1]*i%mod;
11 }
12 }
13 int main(){
14 //freopen("in.txt","r",stdin);
15 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
16 cin>>n;
17 t=2;
18 get(maxn);
19 for(int i=4;i<=n;i++){
20 t=(i-2)*jie[i-1]%mod+2*t%mod;
21 t=t%mod;
22 }cout<<t<<endl;
23 return 0;
24 }
D
题意
给出一个$01$矩阵,要求任意偶数阶的子方阵中的$1$的个数为奇数个,问至少修改多少个位置可以满足条件。
分析
当中没有思路(应该说就是放弃了),结束了以后听同学说只要$min(n,m) \ge 4$就不行了,因为有$4$个二阶子方阵,加起来必为偶数,所以直接输出$-1$;剩下的数据量就小的多了,明天试着做一下吧。