Codeforces Round #714 (Div. 2)

前言:切题记1。还是只做出一道…

A. Array and Peaks
  从2号开始,相邻的两个换一下就行。



B. AND Sequences
  题目:给出一个数组a,你可以对其任意排列,问达成a1&a2&…&ai=ai+1&ai+2&…&an(1 <= i <= n)的排列有多少种。
  推导题,设a的前缀与为pre,后缀与为suf,则题目的含义变成pre[i] = suf[i+1],根据题意,从i等于1开始,有pre[1] = suf[2],pre[2] = suf[3] … 根据与的性质,x&y <= x,既x和别的数与,x不会变大。那么有suf[2] = suf[3]&a[2] <= suf[3] ,pre[2] <= pre[1] ,既 pre[2] <= pre[1] = suf[2] <= suf[3] ,所以a[1] = pre[1] = pre[2] = suf[2] = suf[3] 。同理,对于所有的i,有a[1] = pre[i] = suf[i] = a[n]
  所以由于a[1] = pre[i],对于所有i,有a[i] & a[1] = a[i] & a[n] = a[1] = a[n],否则不能成立。而根据与的性质,若x>y , 则x&y < x。所以a[1]和a[n]一定是所有数中最小(不能大于任何数)的。
  那么设a中最小的数的数量为cnt,当cnt<2时,满足题意的序列不存在;当cnt>=2时,先要选两个最小的作为a1和an,有cnt*(cnt-1)种方式,剩下的n-2个数可以随意排列,所以最终排列数为 :cnt*(cnt-1)*(n-2!)。





C. Add One
  题目:给出一个数n,进行m次操作:对于n的每一位数d,用d+1代替。问:m次操作后n的长度(位数)。 例如:n=9692,进行一次操作后,变为107103。( (10)(7)(10)(3) )。
  我们知道如果n变长,那它的变长的数x都会经历x->10的变化,所以我们可以以10为初始状态研究。进行十次操作,则所有位都会变长,我们可以以每10次操作来研究。
  状态1:10
  状态2:21 10(进行十次操作)
  状态3:3221 2110(进行二十次操作)
  状态4:43323221 32212110(进行三十次操作)
  … …
  记状态的前半段为begin,后半段为end,整段为sum,将两段拼接起来为符号x。我们知道:
  (1).begin[i] = end[i]+1
  (2).i>=2时,end[i] = sum[i-1]
  所以,sum[i] == (end[i]+1) x end[i] == (sum[i-1]+1) x sum[i-1] 。(这里+1是所有位+1)。
  由于等式:sum[i] == (sum[i-1]+1) x sum[i-1] 这里i是代表十次操作,
所以对于单次操作sum[i] == sum[i-9] x sum[i-10] ,既当前串为 9次操作前的串拼接上10次操作前的串。设 dp[i] 为对10进行i次操作后的长度,则dp[i] = dp[i-9] + dp[i-10] ,初始有dp[0~8] = 2,dp[9] = 3。(说了这么多终于绕回来了 )然后看看n的每一位变成10要多少次操作,dp[剩下的操作数]就是每位的最终长度,然后加起来就是答案了。

추천

출처blog.csdn.net/m0_45699242/article/details/116048361