【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业
Time Limit: 10 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Main idea
给定一个n,m,创造一个数字顺序连接1~n,输出这个数对m取模的值。
Solution
n<=10^18,排除找规律的可能性,立马想到了用矩阵乘法优化DP,令f[i]表示1~i的值,那么:
然后我们只要推出矩阵即可,轻松想到了:
然后分段矩乘得到答案。
Code
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cmath> 8 using namespace std; 9 10 const int ONE=5; 11 12 long long n,MOD; 13 long long a[ONE][ONE],b[ONE][ONE]; 14 long long Index; 15 16 17 void Mul(long long a[ONE][ONE],long long b[ONE][ONE],long long ans[ONE][ONE]) 18 { 19 long long jilu[ONE][ONE]; 20 for(int i=1;i<=3;i++) 21 for(int j=1;j<=3;j++) 22 { 23 jilu[i][j]=0; 24 for(int k=1;k<=3;k++) 25 jilu[i][j]=(jilu[i][j] + a[i][k]*b[k][j]%MOD) % MOD; 26 } 27 28 for(int i=1;i<=3;i++) 29 for(int j=1;j<=3;j++) 30 ans[i][j]=jilu[i][j]; 31 } 32 33 void Matrix(long long a[ONE][ONE],long long b[ONE][ONE],long long t) 34 { 35 while(t) 36 { 37 if(t&1) Mul(a,b,a); 38 Mul(b,b,b); 39 t>>=1; 40 } 41 } 42 43 int main() 44 { 45 cin>>n>>MOD; 46 a[1][3]=1; 47 48 long long len=1; 49 for(;;) 50 { 51 len*=10; 52 memset(b,0,sizeof(b)); 53 for(int i=1;i<=3;i++) 54 { 55 for(int j=1;j<=i;j++) 56 b[i][j]=1; 57 } 58 b[1][1]=len % MOD; 59 60 if(len<=n) Index=len-len/10; 61 else Index=n-len/10+1; 62 Matrix(a,b,Index); 63 if(len>n) break; 64 } 65 66 printf("%lld",a[1][1]); 67 }
View Code
转载于:https://www.cnblogs.com/BearChild/p/6441341.html
【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]相关推荐
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include& ...
- bzoj2326 [HNOI2011]数学作业
矩阵乘,按位搞 两个矩阵,分别为 ans00i00100 10k11011001 快速幂转移就好了 #include <cstdio> #include <cstring> # ...
- bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2249 Solved: 1301 [Submit][St ...
- 洛谷 P3216 [HNOI2011]数学作业
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P3216 [HNOI2011]数学作业 题目 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正 ...
- HNOI2011 数学作业
先上一下题目吧 HNOI2011 数学作业 Problem 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算 Concatenate(1..N) ...
- bzoj 2326: [HNOI2011]数学作业
Description 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:给定正整数 N 和 M 要求计算 Concatenate (1 .. N) Mod M 的值,其中 Conc ...
最新文章
- wxWidgets:wxConfig 概述
- 《数据中台:让数据用起来》读书笔记
- 【Logstash】记录一次logstash拉取数据很慢的问题
- 电脑的基本按键功能有哪些?
- 全解电磁流量计功能和精度性能
- pingpong php,php – 使用pingpong包在laravel 5.1中创建子模块文件夹
- 幻读Java_关于幻读 - hellopretty - 博客园
- Maven入门教程(十七)-Maven多Moudle项目创建
- html统计表合并单元格的快捷键,excel中合并单元格的快捷键的方法及设置技巧
- 外汇和股票有什么区别啊?
- Excel合并多个有文本的单元格
- NDN的互联网信息高速最后一公里
- 信号灯管理服务器CPU型号,正文-新华三集团-H3C
- pip安装.whl文件
- 【CTF bugku 秋名山车神】关于会话脚本、session、正则表达式
- 距离2022年春节还有多少天?2022年春节倒计时天数在手机便签上设置
- 虚拟机搭建svn服务器,轻松搭建一台Windows SVN服务器
- arm+fpga架构优势,米尔MYC-JX8MMA7新品发布!
- 山东理工大学计算机组成原理试题,山东理工大学成人高等教育计算机组成原理试卷(共3份)...
- 企业移动设备管理(MDM)概述
热门文章
- Magento模块解析
- javacore分析工具_「赵强老师」如何分析Java的内存溢出问题
- python哪些是可变对象_什么是Python可变对象和不可变对象
- iphone无线服务器未响应,iPhone无线充电断断续续或无法充电是什么原因?
- ioca0中断 pic单片机_关于PIC单片机的一些经验总结 -单片机-电子工程世界网
- cd命令无法切换路径(Windows下)
- rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
- 关于startActivityForResult
- hdu 5339 Untitled【搜索】
- jspxcms bug表