【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述
.jpg)
题解
矩阵乘法
考虑把相同位数的数放到一起处理:
设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡献:
$v_i=(r-i+1)10^{k(i-1)}$
所以要求的就是:
$\sum\limits_{i=1}^{r-l+1}(r-i+1)10^{k(i-1)}\mod m\ =\ \sum\limits_{i=0}^{r-l}(r-i)10^{ki}\mod m$
这个式子可以使用矩阵乘法解决。具体方法:
$\begin{bmatrix}(r-i)10^{ki}&10^{ki}&sum_{i-1}\end{bmatrix}*\begin{bmatrix}10^k&0&1\\-10^k&10^k&0\\0&0&1\end{bmatrix}=\begin{bmatrix}(r-i-1)10^{k(i+1)}&10^{k(i+1)}&sum_i\end{bmatrix}$
然后再乘上$10^{该位后面的位数}$即为它们对答案的贡献。把所有位数的数的贡献加起来即为答案。
注意需要unsigned long long。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
int m;
struct data
{
ull v[3][3];
data(ull x = 0) {memset(v , 0 , sizeof(v)) , v[0][0] = v[1][1] = v[2][2] = x;}
ull *operator[](int a) {return v[a];}
data operator*(data a)
{
data ans;
int i , j , k;
for(i = 0 ; i < 3 ; i ++ )
for(j = 0 ; j < 3 ; j ++ )
for(k = 0 ; k < 3 ; k ++ )
ans[i][j] = (ans[i][j] + v[i][k] * a[k][j]) % m;
return ans;
}
}a;
data pow(data x , ull y)
{
data ans(1);
while(y)
{
if(y & 1) ans = ans * x;
x = x * x , y >>= 1;
}
return ans;
}
ull pow(ull x , ull y)
{
ull ans = 1;
while(y)
{
if(y & 1) ans = ans * x % m;
x = x * x % m , y >>= 1;
}
return ans;
}
int main()
{
ull i , j , n , now = 1 , ans = 0;
scanf("%llu%d" , &n , &m);
for(i = 1000000000000000000ull , j = 19 ; i ; i /= 10 , j -- )
{
if(n < i) continue;
a[0][0] = a[1][1] = i % m * 10 % m , a[1][0] = (m - a[0][0]) % m , a[0][2] = a[2][2] = 1 , a[0][1] = a[1][2] = a[2][0] = a[2][1] = 0;
a = pow(a , n - i + 1);
ans = (ans + (n % m * a[0][2] % m + a[1][2]) * now) % m , now = now * pow(10 , j * (n - i + 1)) % m , n = i - 1;
}
printf("%llu\n" , ans);
return 0;
}
【bzoj2326】[HNOI2011]数学作业 矩阵乘法的更多相关文章
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- BZOJ 2326: [HNOI2011]数学作业(矩阵乘法)
传送门 解题思路 NOIp前看到的一道题,当时想了很久没想出来,NOIp后拿出来看竟然想出来了.注意到有递推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1-i\)连接起 ...
- BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- [HNOI2011]数学作业 --- 矩阵优化
[HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\; ...
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 输入文件只有一行为用空 ...
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)
题目大意:输入n(n<=10^18)和m,将1~n的整数连起来模m输出,比如n=13则输出12345678910111213模m的数. 设f[i]为1~i整数连起来模m的数,i的位数为k,则有f ...
随机推荐
- Mac mysql安装失败解决方法
在mac终端通过命令安装mysql,提示错误,解决方法如下: (1)安装命令:brew install mysql (2)提示错误: Error:Could not create /usr/local ...
- Plugin was not installed: Cannot download 'https://plugins.jetbrains.com/pluginManager''
在Android studio中安装插件的时候,提示了类似这种的错误,解决这个问题有以下几步 1.打开Configure->Settings 2.System Settings->Upda ...
- JS如何给ul下的所有li绑定点击事件,点击使其弹出下标和内容
这是一个非常常见的面试题,出题方式多样,但考察点相同,下面我们来看看这几种方法:方法一: var itemli = document.getElementsByTagName("li&quo ...
- mysql数据库的基本使用命令总结
mysql数据库是一个常用的关系型数据库 关系型数据库核心元素有哪些? 主键:特殊字段,用来唯一标识记录的唯一性 字段:数据列 记录:数据行 数据表:数据行的集合 数据库:数据表的集合 安装.启动.停 ...
- C# Regex正则验证规则
using System; using System.Text.RegularExpressions; namespace MetarCommonSupport { /// <summary&g ...
- ThinkPHP框架目录的介绍
library目录 Think目录 mvc
- C# 隐藏窗口标题栏、隐藏任务栏图标
//没有标题 this.FormBorderStyle = FormBorderStyle.None; //任务栏不显示 this.ShowInTaskbar = false;
- R语言学习笔记(三):零碎知识点(1-10)
1--c() c表示"连接"(concatenate). 在R中向量是连续存储的,因此不能插入或删除元素. 2--seq() seq()的特殊用法,可以用在for循环里for(i ...
- AES128加密-S盒和逆S盒构造推导及代码实现
文档引用了<密码编码学与网络安全--原理和实践>里边的推导过程,如有不妥,请与我联系修改. 文档<FIPS 197>高级加密标准AES,里边有个S盒构造,涉及到了数论和有限域的 ...
- ABAP CDS ON HANA-(11)ABAP CDSでの関連付け
Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...