題意場
萌新認識到了手速的可怕。
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;
}