bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)
题目大意:输入n(n<=10^18)和m,将1~n的整数连起来模m输出,比如n=13则输出12345678910111213模m的数。
设f[i]为1~i整数连起来模m的数,i的位数为k,则有f[i]=(f[i-1]*10^k+i)mod m。可以发现f[i-1]和10^k都是会变化的,不能直接矩乘,这就尴尬了>_<。但是仔细想想(跑去问CZL),其实可以分段来矩乘,把k一样的数矩乘(1..9一样,10..99一样,100..999一样)就行了,这样就变成了ax+by+c的形式,b=1,c=0,然后魔改
orz CZL初二的时候1A,然而我却WA了好几次才AC。。。自从被模的巨大常数坑过之后就不敢多用取模了,最后全加了居然就过了,坑爹的取模T_T。
真的写的非常丑的代码如下:
type
poi=array[..,..]of qword;
var
map,g,c:poi;
f:array[..]of qword;
n,p,t,tt:qword;
i,j,k,num:longint; procedure merge(var a,b:poi);
var
i,j,k:longint;
begin
fillchar(c,sizeof(c),);
for i:= to do
for j:= to do
for k:= to do
c[i,j]:=(c[i,j]+((a[i,k] mod p)*(b[k,j] mod p))mod p)mod p;
move(c,a,sizeof(c));
end; procedure qp(n:int64);
var
i,j,k:longint;
begin
if tt<> then
begin
fillchar(map,sizeof(map),);
fillchar(g,sizeof(g),);
end;
map[,]:=tt*;map[,]:=;map[,]:=;map[,]:=;map[,]:=;
g[,]:=;g[,]:=;g[,]:=;
while n<> do
begin
if n and = then merge(g,map);
merge(map,map);
n:=n>>;
end;
fillchar(c,sizeof(c),);
for i:= to do
for j:= to do
for k:= to do
c[i,j]:=(c[i,j]+(g[i,k]*f[k])mod p)mod p;
for i:= to do
f[i]:=c[i,];
end; begin
readln(n,p);
f[]:=;f[]:=;g[,]:=;g[,]:=;g[,]:=;
map[,]:=;map[,]:=;map[,]:=;map[,]:=;
t:=;num:=;
while n>=t do
begin
inc(num);
t:=t*;
end;
dec(num);
tt:=;
for i:= to num do
begin
if i=num then qp(n-tt+)
else qp(tt*-tt);
tt:=tt*;
end;
writeln(f[]);
end.
bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)的更多相关文章
- [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...
- BZOJ2326 HNOI2011数学作业(矩阵快速幂)
考虑暴力,那么有f(n)=(f(n-1)*10digit+n)%m.注意到每次转移是类似的,考虑矩阵快速幂.首先对于位数不同的数字分开处理,显然这只有log种.然后就得到了f(n)=a·f(n-1)+ ...
- BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include& ...
- BZOJ2326 [HNOI2011]数学作业(分块矩阵快速幂)
题意: 定义函数Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数,如concatenate(1..5)是12345,求concatenate(1...n ...
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- P3216 [HNOI2011]数学作业 (矩阵快速幂)
P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...
- BZOJ 2326 数学作业(分段矩阵快速幂)
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...
- 【矩阵乘法】bzoj2326 [HNOI2011]数学作业
http://hzwer.com/2831.html #include<cstdio> #include<iostream> #include<vector> us ...
随机推荐
- hdu6027Easy Summation(快速幂取模)
Easy Summation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- Linux命令应用大词典-第43章iptables和arptables防火墙
43.1 iptables-save:保存iptables规则 43.2 iptables-restore:恢复iptables规则 43.3 iptables:IPv4数据包过滤和NAT管理工具 4 ...
- Linux命令应用大词典-第19章 文件系统管理
19.1 mkfs:创建Linux文件系统 19.2 mke2fs:创建ext2.3.4文件系统 19.3 mkfs.ext4:创建ext4文件系统 19.4 mkfs.ext3:创建ext3文件系统 ...
- 【WXS全局对象】Math
Math对象用于执行数学任务. 属性: 名称 说明 Math.E 代表算术常量 e,即自然对数的底数,其值近似于 2.71828. Math.LN10 就是 loge10,即 10 的自然对数,其值近 ...
- servlet和Jsp的复习整理
servlet 1.生命周期 a.构造方法.生成一个servlet b.init()方法.当开启服务器时,servlet第一次被装载,servlet引擎调用这个servlet的init()的方法,只调 ...
- Java 消息对列
ActiveMQ入门实例 1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5. ...
- pthon web框架flask(二)--快速入门
快速入门 迫切希望上手?本文提供了一个很好的 Flask 介绍.假设你已经安装 Flask, 如果还没有安装话,请浏览下 安装 . 一个最小的应用 一个最小的应用看起来像这样: from flask ...
- 局部加权回归(LWR) Matlab模板
将百度文库上一份局部加权回归的代码,将其改为模板以便复用. q2x,q2y为数据集,是n*1的矩阵: r是波长参数,就是对于距离的惩罚力度: q_x是要拟合的数据横坐标,是1*n的矩阵: 得到的q_y ...
- 基于freeRTOS定时器实现闹钟(定时)任务
基于freeRTOS定时器实现闹钟(定时)任务 在智能硬件产品中硬件中,闹钟定时任务是基本的需求.一般通过APP设置定时任务,从云端或者是APP直连硬件将闹钟任务保存在硬件flash中,硬件运行时会去 ...
- spring boot 中文乱码问题
在刚接触spring boot 2.0的时候,遇到了一些中文乱码的问题,网上找了一些解决方法. 这里自己做个汇总. 在application.properties文件中添加: spring.http. ...