题意:

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

分析:

dp+矩阵快速幂。

假如现在的数是m,模x余数是n,那么再从下一个block中选一个数a,a模x余数为b,那么新的数的余数就为(m∗10+a)%x,也就是(n∗10+b)%x,所以实际上我们只需要直接对余数进行操作。容易得到状态转移方程,其中dp[i][j]表示从第i个block中选择一个数后,余数为j的方案数,cnt[m]为余数为m的数的个数。

  1. dp[i][(j * 10 + m) % x] = dp[i-1][j] * cnt[m];

可是b高达109,规模太大直接递推的话效率太低,而x最大仅为100,直接用矩阵表示这个递推式,时间复杂度则降为O(x3logb)。

代码:

  1. #include<cstdio>
  2. const int maxn = 50005;
  3. int cnt[maxn], r[maxn];
  4. const int N = 105, mod = 1e9 + 7;
  5. struct Matrix
  6. {
  7. int row,cal;
  8. long long m[N][N];
  9. };
  10. Matrix init(Matrix a, long long t)
  11. {
  12. for(int i = 0; i < a.row; i++)
  13. for(int j = 0; j < a.cal; j++)
  14. a.m[i][j] = t;
  15. return a;
  16. }
  17. Matrix mul(Matrix a,Matrix b)
  18. {
  19. Matrix ans;
  20. ans.row = a.row, ans.cal = b.cal;
  21. ans = init(ans,0);
  22. for(int i = 0; i < a.row; i++)
  23. for(int j = 0; j < b.cal; j++)
  24. for(int k = 0; k < a.cal; k++)
  25. ans.m[i][j] = (ans.m[i][j] + a.m[i][k] * b.m[k][j])%mod;
  26. return ans;
  27. }
  28. long long quick_pow(int k, int x, int res, Matrix A)
  29. {
  30. Matrix I;
  31. I.row = x, I.cal = 1;
  32. I = init(I, 0);
  33. for(int i = 0; i < x; i++)
  34. I.m[i][0] = cnt[i];
  35. while(k){
  36. if(k&1) I = mul(A, I);
  37. A = mul(A, A);
  38. k>>=1;
  39. }
  40. return I.m[res][0]%mod;
  41. }
  42. int main (void)
  43. {
  44. int n, b, k, x;
  45. int a;
  46. scanf("%d%d%d%d",&n,&b,&k,&x);
  47. for(int i = 0; i < n; i++){
  48. scanf("%d",&a);
  49. cnt[a%x]++;
  50. }
  51. for(int i = 0; i < x; i++)
  52. r[i] = (i *10)%x;
  53. Matrix t;
  54. t.row = t.cal = x;
  55. for(int i = 0; i < t.row; i++)
  56. for(int j = 0; j < t.cal; j++)
  57. t.m[i][j] = cnt[(i+x-r[j])%x];
  58. printf("%I64d",quick_pow(b-1, x, k, t));
  59. return 0;
  60. }

Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】的更多相关文章

  1. codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)

    题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...

  2. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  3. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  4. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  5. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  6. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

  7. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  8. CODEFORCEs 621E. Wet Shark and Blocks

    E. Wet Shark and Blocks time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  9. Educational Codeforces Round 60 D dp + 矩阵快速幂

    https://codeforces.com/contest/1117/problem/D 题意 有n个特殊宝石(n<=1e18),每个特殊宝石可以分解成m个普通宝石(m<=100),问组 ...

随机推荐

  1. AJPFX总结正则表达式的概述和简单使用

    正则表达式的概述和简单使用* A:正则表达式        * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用.        * 作用:比如注 ...

  2. leetcode764 Largest Plus Sign

    思路: 首先使用dp计算出在每个位置(i, j)上下左右最多有多少个连续的1,得到up[i][j], down[i][j], left[i][j], right[i][j].然后计算这四个值中的最小值 ...

  3. 2017广东工业大学程序设计竞赛决赛 H tmk买礼物

    题意: Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第21 ...

  4. Node.js——render封装

    封装 挂在到res上

  5. linux 10201 ASM RAC 安装+升级到10205

    准备环境的时 ,要4个对外IP,2个对内IP 不超过2T,,一般都用OCFS 高端存储适合用ASM linux10G安装的时候,安装的机器时间要小于等于(如果是等于要严格等于)第二个机器的时间(只有l ...

  6. chvt - 修改虚拟终端的前台环境

    SYNOPSIS(总览) chvtN DESCRIPTION(描述) chvt N 命令用来生成 /dev/ttyN 的前台终端.如果它本来不存在,即创建相应的屏幕.为了删除掉不用的VT(虚拟终端), ...

  7. 一个圆的移动 AE教程 速度曲线调节

    AE里面速度的曲线调节 最终的小效果 两个关键点: 一:速度曲线调节 编辑速度图标,他的曲线是编辑速度的. 二:节点不要用贝塞尔曲线 编辑值图标,就是圆圈的x值y值的曲线.控制位置移动的. 选择一个节 ...

  8. CAD参数绘制实心圆弧填充(com接口)

    C#中实现代码说明: private void DrawPathToHatch1() { //把路径的开始位置移动指定的点 //参数一为点的X坐标 ,参数二为点的Y坐标,参数三为该点处开始宽度,对Po ...

  9. OpenCV2:应用篇 QT+OpenCV实现图片编辑器

    一.简介 做完会放在Github上  

  10. joda-time时间操作组件

    今天看到了学习到了一个不错的操作时间的jar包,很方便的,以后操作时间运算就可以直接使用jar包中的方法了,再也不用自己写操作时间的方法了.懒的不行不行的 <!-- 时间操作组件 --> ...