题目链接:

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. 设置field的背景颜色以及对stylesheet的理解

    今天遇到一个需求:在做页面输入验证的时候,如果用户没有输入某个项,那么这个项显示为红色,一直没头绪,也找peoplebook,发现field有一个style的方法,后来又在谷歌上找,终于找到了方法: ...

  2. sublime简单配置

    Preferences------->settings user { "font_face": "Courier New", "font_siz ...

  3. Mysql导入导出 改密命令总结(笔记三)

    一.从数据库导出数据 注意这些语句的执行是在在没进入mysql命令行之前,在mysql命令行不行 C:\Windows\system32>导出命令 而不是 Mysql>导出命令 1.导出整 ...

  4. Map(双列集合)

    出现的原因:现实生活中有些数据成对存在. 特点:键不可重复,值可以重复. ----------|Map                数据都是以键值对的形式存在,键唯一,值可重复. --------- ...

  5. POJ-1579

    #include <stdio.h> #include <stdlib.h> ][][]; int w(int a,int b,int c){ ||b<=||c<= ...

  6. 09-排序3 Insertion or Heap Sort

    和前一题差不多,把归并排序换成了堆排序.要点还是每一次排序进行判断 开始犯了个错误 堆排序该用origin2 结果一直在排序origin ,误导了半天以为是逻辑错误...一直在检查逻辑 建立最大堆 排 ...

  7. Java之HttpURLConnection的变态事: Keep-Alive

    HttpURLConnection的变态事: Keep-Alive JDK自带的HttpURLConnection默认启动Keep-Alive, 使用后的HttpURLConnection会放入池里重 ...

  8. golang构造函数与转换函数

    golang的每种类型, 凡是用type定义的类型, 其类型名既是其构造函数,也是其转换函数. 其中,构造函数后眼{...}, 转换函数后跟(...)

  9. Swift弹窗

    在一个ViewController中使用以下代码: let alertController = UIAlertController(title: "Game Set", messa ...

  10. Web开发者和设计师必须要知道的 iOS 8 十个变化

    原文出处: mobilexweb   译文出处:罗磊(@罗罗磊磊)   欢迎分享原创到伯乐头条 喜大普奔,喜极而泣,喜当爹,随着iPhone 6和iPhone 6 plus的上市,ios 8终于在上周 ...