Codeforces Round #663 (Div. 2)
A. Suborrays
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e5+10,mod=1e9+7;
void solve(){
int n,i;
for (cin>>n,i=1; i<n;++i) cout<<i<<" ";
cout<<n<<endl;
}
int main(){
int _;
cin>>_;
while(_--) solve();
return 0;
}
B - Fix You
思路:
只要变边界的即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e5+10,mod=1e9+7;
void solve(){
int n,m,sum=0,i;
char a;
for(cin>>n>>m,i=1;i<=n;++i)
for(int j=1;j<=m;++j){
cin>>a;
if(((i==n&&a!='R')||(j==m&&a!='D'))&&a!='C')sum++;
}
cout<<sum<<endl;
}
int main(){
int _;
cin>>_;
while(_--) solve();
return 0;
}
C. Cyclic Permutations
题意:
对于每一个i∈{1,2,3,…,n},分别在它左右两侧找到距离最近且比pi大的元素pj在i和j中间连一
条无向边。如果找不到就不连。(注意是按下标连边,不是按值连边)
思路:
对于一个元素i,如果它的两侧均有大于i的元素,那么必然会成环,不难发现如果元素先递增至n,再递减,便不成环。对于除了n以外的所有元素,均可选择放入n前面或n后面,即
2^(n-1)种排列方式。
即:n!-2^(n-1)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e5+10,mod=1e9+7;
void solve(){
ll n,sum=1,a=1,i=2;
for (cin>>n;i<=n;++i)
sum=(sum*i)%mod,a=(a*2)%mod;
cout<<(sum-a+mod)%mod<<endl;
}
int main(){
int _=1;
while(_--) solve();
return 0;
}