solution-cf621e

CF621E题解

posted on 2022-08-25 09:37:22 | under 题解 | source

题面

\(b\) 个格子,每个格子有 \(n\) 个数字,各个格子里面的数字都是相同的. 求从 \(b\) 个格子中各取一个数字,构成一个 \(b\) 位数,使得这个 \(b\) 位数模 \(x\)\(k\) 的方案数(同一格子内相同的数字算不同方案)。

我们设 \(dp_{i,j}\) 表示前 \(i\) 个格子中取数后,模 \(x\) 的结果为 \(j\) 的方案数。

递推式也容易推出来:\(dp_{i,(j\times10+a_k)\bmod x}=\sum dp_{i-1,j}\)

但是,这样显然会 TLE。所以我们需要一些优化。

对于每一个 \(i=\overline{1,2,\cdots,b}\),我们可以把 \(dp_{i,j},j=\overline{0,1,\cdots,x-1}\) 当做一个状态。然后根据所给的 \(a\) 进行转移。然后用矩阵快速幂优化即可。

对于矩阵快速幂,这是一种好用的优化递推的算法。

首先,定义矩阵乘法:

对于一个 \(n\times k\) 的矩阵 \(A\) 和一个 \(k\times m\) 的矩阵 \(B\) 还有一个矩阵 \(C=A\times B\)。那么 \(C\) 是一个 \(n\times m\) 的矩阵,且 \(C_{ij}=\sum\limits_{p=1}^kA_{i,p}\times B_{p,j}(i=\overline{1,2,\cdots,n},j=\overline{1,2,\cdots,m})\)

然后,因为矩阵乘法满足结合律,所以我们有了矩阵快速幂。矩阵快速幂的话就是把快速幂的板子套在矩阵上而已。

代码:

  #include<bits/stdc++.h>
  #define int long long 
  using namespace std;
  const int mod=1e9+7;
  int n,b,x,k,a[50005];
  struct M{
      int a[100][100];//矩阵
      M operator*(M t){//乘
          M res;
          for(int i=0;i<x;i++)for(int j=0;j<x;j++)res.a[i][j]=0;
          for(int i=0;i<x;i++){
              for(int j=0;j<x;j++){
                  for(int k=0;k<x;k++){
                      res.a[i][j]=(res.a[i][j]+a[i][k]*t.a[k][j]%mod)%mod;
                  }
              }
          }
          return res;
      }
      M operator^(int k){//快速幂
          M res,_=*this;
          for(int i=0;i<x;i++)for(int j=0;j<x;j++)res.a[i][j]=(i==j);
          while(k){
              if(k&1)res=res*_;
              _=_*_;
              k>>=1;
          }
          return res;
      }
  }ans,base;
  signed main()
  {
      scanf("%lld%lld%lld%lld",&n,&b,&k,&x);
      for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
      for(int i=0;i<x;i++)for(int j=0;j<x;j++)ans.a[i][j]=0;
      for(int i=0;i<x;i++)for(int j=0;j<x;j++)base.a[i][j]=0;
      ans.a[0][0]=1;
      for(int i=0;i<x;i++){
          for(int j=1;j<=n;j++){
              base.a[(i*10+a[j])%x][i]++;//求出转移式
          }
      }
      ans=(base^(b))*ans;//推!
      printf("%lld",ans.a[k][0]);
      return 0;
  }
posted @ 2025-02-25 15:31  Grisses  阅读(32)  评论(0)    收藏  举报
Document