ACMC6
A - Suborrays CodeForces - 1391A
題意:找一個序列(從1到n,每個數字只出現一次),使序列中的第i到第j(i,j大於等於1且小於等於n,
j大於等於i)個元素的或大於等於j-i+1。
思路:j-i+1實際上就是子序列長,第i到第j個元素的或大於等於該子序列的最大值,而一個長為n的子序列中的
最大值一定大於等於n,則實際上任意序列均成立。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = n; i >= 1; i--)
printf("%d ",i);//隨便一個序列都行
cout << endl;
}
//system("pause");
return 0;
}
B - Fix You CodeForces - 1391B
除右邊界和下邊界的值不管是什麼,最終都會使這些範圍內的起點到達這兩邊界,則只需要將下邊界的D變R,
右邊界的R變D即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
int sum=0;
char c;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
cin>>c;
if(j==b-1&&c=='R')
sum++;
else if(i==a-1&&c=='D')
sum++;
}
}
cout<<sum<<endl;
}
//system("pause");
return 0;
}
C - Cyclic Permutations CodeForces - 1391C
可知,只要序列中有x,y,z(y小於x和z)即可成環(y與xz連,x與z連,形成一個3元素環),即只要序列中
存在山谷就行。可以運用容斥原理,拋去只有山峰的情況,設最大值在第i位,則其左邊是遞增子序列,右邊是
遞減子序列,而只要確定左側的情況,右側就只有一種情況可選。而左側有i-1個元素,從n-1個元素裡挑選,
i可取1-n,即總情況為(C是組合數符號)C(n-1)(0)+C(n-1)(1)+.....+C(n-1)(n-1),即2^(n-1).
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
int main()
{
int n;
cin>>n;
ll sum=1;
ll re=1;
for(int i=1;i<=n;i++)
{
sum=sum*i%mod;
if(i!=1)
re=re*2%mod;
}
cout<<((sum-re)+mod)%mod<<endl;//取mod後sum可能小於re
//system("pause");
return 0;
}
此題涉及到了取mod防超界的問題,則一切較大的數均應取mod,且取mod後的數相減出現了不該出現的負值,
要將這種情況再次通過取mod化為正數.
待補全ing