题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5564

题意:

求长度在[L,R]范围,并且能整除7的整数的总数。

题解:

考虑最原始的想法:

dp[i][j][k]表示长度为i,并且对7取模得到j的以k结尾的数。

则有状态转移方程dp[i+1][(h*10)+l)%7][k]+=dp[i][h][k'](k+k'!=K).

但是i范围是1~10^9,需要矩阵加速。

这里对dp[i][j][k]的[j][k]两个状态进行压缩,得到转移矩阵mat[70][70],其中mat[s1][s2]表示由状态s2变到状态s1的可行性。

并且由于dp[i][j][k]记录的是长度为i的情况,而我们要求的是所有长度小于等于i的前缀和,所以,我们还要加一行一列来计算所有模7等于零的数的个数。

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = ;
const int mod = 1e9 + ;
typedef long long LL; struct Matrix {
LL mat[maxn][maxn];
Matrix() { memset(mat, , sizeof(mat)); }
friend Matrix operator *(const Matrix& A, const Matrix& B);
friend Matrix operator ^(Matrix A, int n);
}; Matrix operator *(const Matrix& A, const Matrix& B) {
Matrix ret;
for (int i = ; i < maxn; i++) {
for (int j = ; j < maxn; j++) {
for (int k = ; k < maxn; k++) {
ret.mat[i][j] += A.mat[i][k] * B.mat[k][j] % mod;
ret.mat[i][j] %= mod;
}
}
}
return ret;
} Matrix operator ^(Matrix A, int n) {
Matrix ret;
for (int i = ; i < maxn; i++) ret.mat[i][i] = ;
while (n) {
if (n & ) ret = ret*A;
A = A*A;
n /= ;
}
return ret;
} int L, R, K; int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d%d", &L, &R, &K); L--;
Matrix A, B;
//转移矩阵
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
int x1 = i / , y1 = i % ;
int x2 = j / , y2 = j % ;
if (y1 + y2 == K) continue;
if ((x2* + y1) % == x1) A.mat[i][j] = ;
}
}
//计算前缀和
for (int i = ; i < ; i++) A.mat[][i] = ;
A.mat[][] = ; //初始向量
for (int i = ; i < ; i++) B.mat[(i%)*+i][]++; Matrix AR = A^R, AL = A^L;
Matrix BR = AR*B, BL = AL*B;
LL ans = BR.mat[][] - BL.mat[][];
printf("%lld\n", (ans%mod+mod)%mod);
}
return ;
}

HDU 5564 Clarke and digits 状压dp+矩阵加速的更多相关文章

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

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

  2. [Bzoj2004][Hnoi2010]Bus 公交线路(状压dp&&矩阵加速)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 看了很多大佬的博客才理解了这道题,菜到安详QAQ 在不考虑优化的情况下,先推$dp ...

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

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

  4. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

  5. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  6. HDU 1074 Doing Homework(状压DP)

    第一次写博客ORZ…… http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 http://acm.hdu.edu.cn/showproblem.p ...

  7. HDU 4906 Our happy ending (状压DP)

    HDU 4906 Our happy ending pid=4906" style="">题目链接 题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字.然 ...

  8. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  9. HDU 4568 Hunter 最短路+状压DP

    题意:给一个n*m的格子,格子中有一些数,如果是正整数则为到此格子的花费,如果为-1表示此格子不可到,现在给k个宝藏的地点(k<=13),求一个人从边界外一点进入整个棋盘,然后拿走所有能拿走的宝 ...

随机推荐

  1. Show Roles Assigned to a Specific User

     Here is a query that I often use to lookup Roles assigned to a specific PeopleSoft user. At run tim ...

  2. nginx php 安装

    .选定源码目录选定目录 /data/klj/ cd /data/klj/ 2.安装PCRE库cd /data/klj/wget ftp://ftp.csx.cam.ac.uk/pub/software ...

  3. 修改后的SQL分页存储过程,利用2分法,支持排序

    /****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...

  4. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

  5. SynchronizationContext一篇

    SynchronizationContext context; 最近写代码用到了这个,特别记录一下. 作用如下: // 摘要: // 提供在各种同步模型中传播同步上下文的基本功能. public cl ...

  6. 在EF的code frist下写稳健的权限管理系统:开篇(一)

    环境:EF6.0.0.0+Autofac3.5.0.0+MVC4.0+pure6.0+Jquery IDE:vs2012,数据库:vs2008r2 搭建环境如下: 我给它取名字为cactus:仙人球, ...

  7. 谈谈对MVC的理解

    MVC是Model-View-Controler的简称,即模型-视图-控制器.其实MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC中的模型.视图.控制器它们分别承担着不同的任务 ...

  8. XSS的原理分析与解剖[转http://www.freebuf.com/articles/web/40520.html]

    0×01 前言: <xss攻击手法>一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的<白帽子讲WEB安全>和cn4rry的<XSS跨站脚本攻击剖析 ...

  9. c,c++函数返回多个值的方法

    最近遇到一个问题,需要通过一个函数返回多个值.无奈C,C++不能返回多个值.所以就想有什么方法可以解决. 网上方法比较杂乱,一般有两种替代做法: 1. 利用函数的副作用, 返回值在函数外定义, 在函数 ...

  10. 每日一练--C语言--串

    目标 实现串的经典模式匹配算法与KMP算法. 简述 自定义串结构: 串采用定长顺序存储结构,串从下标1开始存储,0下标存储串的实际长度: 匹配成功返回匹配位置,匹配失败返回0. #include &l ...