[HIHO1560] H国的身份证号码II(dp,计数,矩阵快速幂)
题目链接:http://hihocoder.com/problemset/problem/1560
有了数位dp的思维基础,这个递推式很容易想到:
构造转移矩阵的时候思考数位dp的转移。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const LL mod = 1e9+7; 6 const int maxn = 11; 7 8 typedef struct Matrix { 9 LL m[maxn][maxn]; 10 int r, c; 11 Matrix(){ 12 r = c = 0; 13 memset(m, 0, sizeof(m)); 14 } 15 } Matrix; 16 Matrix mul(Matrix m1, Matrix m2, LL mod) { 17 Matrix ans = Matrix(); 18 ans.r = m1.r; ans.c = m2.c; 19 for(int i = 0; i < m1.r; i++) { 20 for(int j = 0; j < m2.r; j++) { 21 for(int k = 0; k < m2.c; k++) { 22 if(m2.m[j][k] == 0) continue; 23 ans.m[i][k] = (ans.m[i][k] + (m1.m[i][j] * m2.m[j][k]) % mod) % mod; 24 } 25 } 26 } 27 return ans; 28 } 29 Matrix quickmul(Matrix m, LL n, LL mod) { 30 Matrix ans = Matrix(); 31 for(int i = 0; i < m.r; i++) ans.m[i][i] = 1; 32 ans.r = m.r; 33 ans.c = m.c; 34 while(n) { 35 if(n & 1) ans = mul(m, ans, mod); 36 m = mul(m, m, mod); 37 n >>= 1; 38 } 39 return ans; 40 } 41 42 LL n; 43 int k; 44 45 signed main() { 46 // freopen("in", "r", stdin); 47 while(~scanf("%lld%d",&n,&k)) { 48 Matrix p; p.r = p.c = 10; 49 for(int i = 0; i <= min(k, 9); i++) { 50 for(int j = 0; j <= min(k, 9); j++) { 51 if(i * j <= k) p.m[i][j] = 1; 52 } 53 } 54 p = quickmul(p, n-1LL, mod); 55 LL ret = 0; 56 for(int i = 0; i <= min(k, 9); i++) { 57 for(int j = 1; j <= min(k, 9); j++) { 58 ret += p.m[i][j]; 59 ret %= mod; 60 } 61 } 62 printf("%lld\n", ret); 63 } 64 return 0; 65 }
转载于:https://www.cnblogs.com/kirai/p/7404160.html
[HIHO1560] H国的身份证号码II(dp,计数,矩阵快速幂)相关推荐
- #1560 : H国的身份证号码II(dp+矩阵快速幂)
#1560 : H国的身份证号码II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整 ...
- H国的身份证号码(搜索)
个人心得:巧妙利用数字进行维护就好了,深搜还是有点心得的: #1558 : H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位 ...
- Hiho303周 H国的身份证号码I
H国的身份证号码I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整数是合法的身份证号 ...
- hihoCoder #1558 : H国的身份证号码I
题目: 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整数是合法的身份证号码当且仅当每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K. 例如对于K ...
- [CSP-S模拟测试]:涂色游戏(DP+组合数+矩阵快速幂)
题目描述 小$A$和小$B$在做游戏. 他们找到了一个$n$行$m$列呈网格状的画板.小$A$拿出了$p$支不同颜色的画笔,开始在上面涂色.看到小$A$涂好的画板,小$B$觉得颜色太单调了,于是把画板 ...
- 【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)
题干: 题目大意: 在一条不满地雷的路上(无限长),你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的可能坐标范围:[1,100000000]. 每次前进p的概率前进一步, ...
- bzoj 1009: [HNOI2008]GT考试(dp+kmp+矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3932 Solved: 2398 [Submit][Sta ...
- 【LOJ #6617】「THUPC 2019」摆家具 / furniture(DP / BSGS / 矩阵快速幂)
传送门 首先显然k=lognk=lognk=logn 显然对于每个iii我们只用关注有多少位与询问的数字不同 考虑分成两个部分 先对每个数字iii求出与他有jjj位不同的数字价值之和 再求出ttt轮后 ...
- Hihocoder-H国的身份证号码I
题目名称:H国的身份证号码I 题目链接:H国的身份证号码I 描述 H国的身份证号码是一个N位的正整数(首位不能是0).此外,由于防伪需要,一个N位正整数是合法的身份证号码当且仅当每位数字都小于等于K, ...
最新文章
- java中日期怎么比较_如何比较Java中的日期?
- Zabbix的邮件报警配置
- OpenCV iOS-视频处理
- C# 得到本机局域网IP地址
- LeetCode 694. 不同岛屿的数量(BFS/DFS+set)
- 非对称加密算法之RSA算法实现
- 楼梯计算机公式,各种楼梯面积的计算公式汇总
- 如何处理word中字体和公式不在同一水平线上
- 若某计算机字长为16位,题目来源于王道论坛 某计算机字长为16位,主存地址空间...
- 通过js滚轮滚动时调用动画_WOW.js在页面滚动时展现动感的元素动画效果
- C++ STL list的成员函数splice的使用
- OpenCV 累加一个三通道矩阵的所有元素
- 23.卷1(套接字联网API)---高级SCTP套接字编程
- 网络蜘蛛Spider的逻辑Logic(一)
- 一键GHOST v2019.08.12优盘教程
- AdventureWorks安装问题总结 exe安装
- matlab:圆形的图像识别(二)
- 前端使用xlsx-js-style导出Excel文件并修饰单元格样式
- c语言校友通讯录毕业论文,校友录毕业论文(C_+sql2005).doc
- subprocess.run方法
热门文章
- 计算机管理单元受到策略限制怎么解决,系统之家win7系统组策略管理单元受到策略限制的解决方法...
- 转场动画-仿AppStore跳转及抖音评论
- 候捷的JAVA英文单词翻译对照表!
- 文亡用计算机,手机计算器阵亡 10%+10%=0.11?
- C/C++Linux服务器开发完整学习路线(含免费学习资料下载地址)
- 手机怎么去掉视频水印,伪原创视频 怎么去视频logo批量处理去重消重去水印去logo软件...
- 阿里云查看mysql数据库密码是多少_阿里云服务器查看数据库密码是多少
- win10/win11安装qt4.8
- 千人互动,18 位业界大咖,2022 开放原子全球开源峰会龙蜥专区总结来了
- 【题解】【AcWing】1609. 前序和后序遍历