题意

出门右转http://codeforces.com/problemset/problem/621/E

题解

首先,一个dp应该是显然的。

\(dp[i][j]\) 表示选到第 \(i\) 个格子,余数是 \(j\) 的方案数,枚举取数 \(l\),得到

\[dp[i+1][(10j+a_{l})\bmod x]\text{ += }dp[i][j]\]

可以发现对于每一个 \(dp[i]\),转移都是类似的。

然后我们考虑用矩阵快速幂优化转移。

初始状态 \(dp[0]\) 是
\[\begin{bmatrix}1\\0\\\vdots\\0\end{bmatrix}\]

然后对于每个数 \(v\),我们修改转移矩阵\(A\)
\[A\left[j\right]\left[\left(10j+v\right)\bmod x\right]\text{ += }1\]
然后最终答案就是 \(A^b\times dp[0]\) 的第 \(k\) 行了。

调试记录

  • 转移矩阵错了QaQ

代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll n, b, k, x;
const ll P = 1000000007;
struct Matrix {ll a[105][105];
};Matrix A, I;inline ll read() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
inline Matrix MatrixMul(const Matrix &A, const Matrix &B) {Matrix ret;for (int i=0; i<x; i++)for (int j=0; j<x; j++) {ret.a[i][j] = 0;for (int k=0; k<x; k++)(ret.a[i][j] += A.a[i][k] * B.a[k][j] % P) %= P;}return ret;
}
inline Matrix Pow(ll k){Matrix ans = I;for (; k; k>>=1, A=MatrixMul(A, A)) if (k&1) ans = MatrixMul(ans, A);return ans;
}int main() {n = read(); b = read(); k = read(); x = read();for (int i=0; i<x; i++) I.a[i][i] = 1;for (int i=0; i<n; i++) {ll val = read();for (int j=0; j<x; j++)++A.a[j][(j*10%x+val%x)%x];}Matrix ret = Pow(b);cout << ret.a[0][k] << endl;return 0;
}

转载于:https://www.cnblogs.com/mchmch/p/codeforces-621E.html

CF621E Wet Shark and Blocks相关推荐

  1. cf621E. Wet Shark and Blocks

    首先如果b在1e6左右 那么普通的dp就可以搞定 但是b的范围给到了1e9  我们就要考虑用矩阵来优化这个dp了 now[i][j]表示初始状态是i,最终状态是j的方案数 那么对于这个矩阵b次幂之后r ...

  2. cf 621E. Wet Shark and Blocks

    神奇,矩阵乘法23333333333333333 递推式是很简单的(连我这种不会DP的人都写出来了.) 需要求出的是转移矩阵(还是叫系数矩阵的),也是最这个东西用快速幂. 这个东西的i,j大概就表示从 ...

  3. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  4. 大二上第十三周学习笔记

    周三 F - The Answer to the Ultimate Question of Life, The Universe, and Everything. (打表) 求a ^ 3 + b ^ ...

  5. Codeforces Round #341 (Div. 2)

    在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h>typedef long l ...

  6. 18行代码AC_Wet Shark and Bishops CodeForces - 621B(数学推导+映射)

    励志用少的代码做高效表达 Problem describe Today, Wet Shark is given n bishops on a 1000 by 1000 grid. Both rows ...

  7. Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学

    D. Rat Kwesh and Cheese 题目连接: http://www.codeforces.com/contest/621/problem/D Description Wet Shark ...

  8. 1.23山师训练赛补题

    文章目录 C - [The__Flash]的电影 D - [The__Flash]的排序 K - [The__Flash]的牛牛 L - [The__Flash]的鲨鲨 C - [The__Flash ...

  9. Shark Hive Spark Hadoop2 进行整合的测试。

    本文目的是测试将shark和hadoop2进行整合. 本来打算使用Shark 最新版0.9.0 ,但是官方好像还没有针对与Hadoop2的正式下载地址.(这个要说明一下,官方只提供了源码,并没有找到编 ...

  10. Windows 7+Code::Blocks+wxWidgets实录(一)

    环境配置篇 玩过Linux的人应该对Code::Blocks和wxWidgets并不陌生. Code::Blocks是一款非常有名的代码编辑器,在linux下用不惯vim的话,这是个不错的选择.但千万 ...

最新文章

  1. 使用python调用zabbix接口截取监控图并生成Word文档
  2. 整合quickx到普通cocos2dx
  3. R语言dplyr包的slice函数提取数据集的数据行实战
  4. 牛客网 【每日一题】5月11日题目精讲 Moovie Mooving
  5. 如何安装pylab:python如何导入matplotlib模块
  6. Git的使用——解决中文乱码
  7. ae自动曝光_拾光剪影|手机摄影对焦曝光与Ae使用
  8. Java-虚拟机-栈帧
  9. 计算机网络TCP与UDP的区别
  10. 卸载 Creative Cloud 桌面应用程序(macOS、Windows)
  11. SSM员工工资管理系统(Java毕设项目)
  12. ASP.NET网页打印
  13. 设置Chrome新标签页为自定义地址页面
  14. 【CTF练习平台】BugkuCTF部分misc writeup
  15. 转自一个计算机毕业生的求职经验
  16. Java之socket网络编程
  17. 切换盘符:使用cmd命令行 cd e: 无法切换到E盘
  18. Spark学习-DAY1
  19. 惠普gk100好不好_「商家透露」惠普gk100和gk400区别比较 哪款好?这样选不盲目...
  20. 三种离婚男人该去面壁思过

热门文章

  1. 设计模式和java实现
  2. C语言-第19课 - #pragma预处理分析
  3. netstat 查看网络状态
  4. 树状数组--前n项和;
  5. 为程序界面添加滑动条
  6. QT 基础类结构图及核心库
  7. table td 纵向求和
  8. JavaWeb(一)
  9. 标记集合 java编译_深入理解Java虚拟机读书笔记-java编译期和运行期优化
  10. 电脑如何恢复声音_电脑不小心丢失照片如何恢复如初