ACMC6

Qingzhx發表於2020-10-05

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