首页 > 其他分享 >Codeforces 832E Vasya and Shifts

Codeforces 832E Vasya and Shifts

时间:2024-05-11 16:41:17浏览次数:12  
标签:Vasya 进制 832E 凑出 Codeforces int 基底 inline

考虑到这个操作实际上就是 \(5\) 进制的不进位加法,其实也就是 \(5\) 进制下的异或。
同时因为是 \(5\) 进制,对于 \(x\in [1, 4]\),\(x\times 0, \cdots, x\times 4\) 刚好可以表示出 \(0\sim 4\)。

于是可以考虑类似 \(2\) 进制的线性基弄个 \(5\) 进制的线性基。
即令 \(w_i\) 为 \(1\sim i - 1\) 位都 \(= 0\) 且第 \(i\) 位 \(\not = 0\) 的基底。
因为有上面的性质,如果遇到了已经有基底的情况,是肯定可以把这一位消成 \(0\) 的。

对于询问,先看能不能凑出这个数。
如果不能凑出,显然为 \(0\)。
否则首先对于基底的选取肯定是唯一的,但是剩下自由元是可以随便选取的,于是令自由元个数为 \(c\),答案即为 \(5^c\)。

时间复杂度 \(\mathcal{O}((n + q)m^2)\)。

#include<bits/stdc++.h>
constexpr int p = 1e9 + 7, mod = 5, T[5][5] = {
   {0, 0, 0, 0, 0},
   {0, 1, 2, 3, 4},
   {0, 3, 1, 4, 2},
   {0, 2, 4, 1, 3},
   {0, 4, 3, 2, 1}
};
const int maxn = 5e2 + 10;
int n, m;
struct node_t {
   int a[maxn];
   inline node_t() {memset(a, 0, sizeof(a));}
   inline int operator [](int x) const {return a[x];}
   inline int &operator [] (int x) {return a[x];}
   inline bool empty() {
      for (int i = 1; i <= m; i++)
         if (a[i]) return false;
      return true;
   }
   inline node_t operator * (const int &v) const {
      node_t b;
      for (int i = 1; i <= m; i++) b[i] = (a[i] * v) % mod;
      return b;
   }
   inline node_t operator - (const node_t &b) const {
      node_t c;
      for (int i = 1; i <= m; i++) c[i] = (a[i] - b[i] + mod) % mod;
      return c;
   }
} w[maxn];
char s[maxn];
inline node_t in() {
   scanf("%s", s + 1);
   node_t a;
   for (int j = 1; j <= m; j++)
      a[j] = s[j] - 'a';
   return a;
}
int main() {
   scanf("%d%d", &n, &m);
   int cnt = 0;
   while (n--) {
      node_t a = in();
      for (int i = 1; i <= m; i++) {
         if (! a[i])
            continue;
         if (! w[i][i]) {
            w[i] = a;
            break;
         }
         a = a - w[i] * T[w[i][i]][a[i]];
      }
      cnt += a.empty();
   }
   int ans = 1;
   for (int i = 1; i <= cnt; i++)
      ans = 1ll * ans * 5 % p;
   int q;
   scanf("%d", &q);
   while (q--) {
      node_t a = in();
      for (int i = 1; i <= m; i++) {
         if (! a[i]) continue;
         a = a - w[i] * T[w[i][i]][a[i]];
      }
      printf("%d\n", a.empty() ? ans : 0);
   }
   return 0;
}

标签:Vasya,进制,832E,凑出,Codeforces,int,基底,inline
From: https://www.cnblogs.com/rizynvu/p/18186749

相关文章

  • Codeforces 1971H ±1
    考虑到因为只有\(3\)行,所以第\(2\)行为\(1\)的条件就是\(1\)的个数\(\ge2\)。对于这种只能去正负且有无解的问题,可以想到用个\(\text{2-SAT}\)。于是接下来考虑用\(\operatorname{AND},\operatorname{OR},\operatorname{XOR}\)来表示至少有\(2\)个\(1\)。考......
  • Codeforces 1761D Carry Bit
    令\(c_i\)为第\(i\)位带来的进位的值,令\(c_{-1}=0\)。考虑如果知道了\(c_{i-1},c_i\)的值,\(a_i,b_i\)有多少种选法:\(c_{i-1}=0,c_i=0\),\((a_i,b_i)=(0,0),(0,1),(1,0)\)。\(c_{i-1}=1,c_i=1\),\((a_i,b_i)=(1,1),(0,1),(1,0)\)。......
  • Codeforces 295D Greg and Caves
    首先可以只考虑有效的行(有黑格的),设有\(h\)行,那么就有\(n-h+1\)种分配方式,最后\(\times(n-h+1)\)即可。对于有效的行,发现如果要考虑中间的部分\([l,r]\)其实可以只用\(len=r-l+1\)来表示。当然肯定会漏掉一些方案的,但考虑知道了\(\max\{len\}\)之后,......
  • Codeforces 1146D Frog Jumping
    首先根据裴蜀定理,能走到的点\(x\)肯定满足\(\gcd(a,b)|x\)。于是令\(g=\gcd(a,b)\),可以考虑求解\(\lfloor\frac{m}{g}\rfloor,\frac{a}{g},\frac{b}{g}\),最后记得去判一下\([g\lfloor\frac{m}{g}\rfloor,m]\)这个区间,因为只有这个区间是不满(区间长度可能\(<g\)......
  • CF1787H Codeforces Scoreboard
    CF1787HCodeforcesScoreboard校内测试的一道题,考试时根本没动。。题面考虑\(k\)比较大的放前面肯定优,然后修门挨着放也肯定优,所以先按\(k\)排个序,然后我们就只考虑每个门修不修。设计状态\(f[i][j]\)表示前\(i\)个点,有\(j\)个门取\(b-kt\),少送回去的最少......
  • CodeForces 1967D Long Way to be Non-decreasing 题解
    题意简述yzh喜欢单调不降序列。她有一个序列\(a\),最初为\(a_1,\ldots,a_n\),其中每个元素都在\([1,m]\)内。她希望使序列变得单调不降,为此,她有一个序列$b_1\ldotsb_m$,每个元素也在\([1,m]\)内。她可以进行若干次操作,一次操作定义为:选择一个集合\(S\subseteq......
  • Codeforces Round 942 (Div. 2) D2
    链接题目要求用数学一点的形式表达出来就是统计有多少a,b满足1.\(1\leqa\leqn,1\leqb\leqm\)2.\(\existsk\inN^*,使得b\timesgcd(a,b)=k\times(a+b)\)首先,把a和b改写,使得\(gcd(a,b)\)消失\(a=q*d,b=p*d\),则,\(gcd(a,b)=d\)条件二变为:\(p\timesd^2=k\times(q\t......
  • Codeforces Round 941 (Div. 2) Div 1 cf941 A-D
     A感觉A比较复杂啊,相比较B简单明了。way1只要有相同的一个数,它的数目大于等于k,那么它就可以进行一次操作,接下来可以再摸k-1个数,那么对于无法凑成k个数的数字来说,无论现在它有多少个数(>=1),加上这k-1个数,都能凑成数目>=k。同时,这个操作可以无限循环下去。所以这道题的出题设......
  • 『Solution』Codeforces 372D Choosing Subtree is Fun
    首先这个\(k\)的限制不是很好入手,考虑先从如果选取了区间\([l,r]\)来入手。那么此时连通块最小的\(siz\)就是把这些点拎出来建虚树对应在原树上的所有点。那么这个有个结论,考虑按\(\operatorname{dfn}\)序排序后的点为\(p_0\simp_{k-1}\),那么对应的最小\(sz\)就......
  • 『Solution』Codeforces 1970B Exact Neighbours
    Easy没什么启发性,直接考虑Medium。考虑到\(a_1=0\),那么\(1\)明显直接和自己配对就行,考虑分配到一个特殊的位置\((1,1)\)。接下来考虑如果还有\(a_i=0\),那么明显\(i\)也是和自己配对,此时因为这是无关紧要的就可以离特殊的\((1,1)\)尽量远一点,也就是让\(x\)坐......