首先不难得出递推式f[i]=(f[i-1]*10^k+i) mod m;
f[i]表示接到第i个数时的余数,k表示i的位数
不难想到先按位数穷举位数,然后对于确定的位数,构造矩阵解决
易得出:
f[i]    10^k  1   1      f[i-1] 
 i   =   0    1   1   *    i-1
 1       0    0   1         1
矩阵乘法优化的特点就是有一维特别的大,且这一阶段的值只和上一阶段有关

 var a,b,w,c:array[..,..] of int64;
f,p:array[..] of int64;
d:array[..] of longint;
e:array[..] of int64;
j,i,l,m:longint;
x,n:int64; procedure mul1;
var i,j,k:longint;
begin
for i:= to do
for j:= to do
begin
c[i,j]:=;
for k:= to do
c[i,j]:=(c[i,j]+a[i,k]*b[k,j] mod m) mod m;
end;
end; procedure mul2;
var i,k:longint;
begin
for i:= to do
begin
f[i]:=;
for k:= to do
f[i]:=(f[i]+c[i,k]*p[k] mod m) mod m;
end;
end; procedure quick(x:int64);
var i,j:longint;
begin
j:=;
while x> do
begin
inc(j);
d[j]:=x mod ;
x:=x div ;
end;
fillchar(c,sizeof(c),);
for i:= to do
c[i,i]:=;
for i:=j downto do
begin
a:=c;
b:=c;
mul1;
if d[i]= then
begin
a:=c;
b:=w;
mul1;
end;
end;
end; begin
readln(n,m);
e[]:=;
l:=;
for i:= to do
begin
e[i]:=e[i-]*;
if e[i]>n then
begin
l:=i;
break;
end;
end;
e[]:=e[] mod m* mod m;
x:=;
w[,]:=e[] mod m; w[,]:=; w[,]:=;
w[,]:=; w[,]:=; w[,]:=;
w[,]:=; w[,]:=; w[,]:=;
f[]:=; f[]:=; f[]:=;
if l<> then x:=
else x:=n-;
p:=f;
quick(x);
mul2;
x:=;
for i:= to l do
begin
p:=f;
if i<>l then x:=x*
else x:=n-e[i-]+; //防止爆int64的
w[,]:=e[i] mod m;
quick(x);
mul2;
end;
writeln(f[]);
end.

bzoj2326的更多相关文章

  1. BZOJ2326 HNOI2011数学作业(矩阵快速幂)

    考虑暴力,那么有f(n)=(f(n-1)*10digit+n)%m.注意到每次转移是类似的,考虑矩阵快速幂.首先对于位数不同的数字分开处理,显然这只有log种.然后就得到了f(n)=a·f(n-1)+ ...

  2. BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...

  3. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

  4. [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)

    Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...

  5. bzoj2326:[HNOI2011]数学作业(分段矩阵乘法)

    题目大意:输入n(n<=10^18)和m,将1~n的整数连起来模m输出,比如n=13则输出12345678910111213模m的数. 设f[i]为1~i整数连起来模m的数,i的位数为k,则有f ...

  6. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法

    题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...

  7. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]

    数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 输入文件只有一行为用空 ...

  8. 【矩阵乘法】bzoj2326 [HNOI2011]数学作业

    http://hzwer.com/2831.html #include<cstdio> #include<iostream> #include<vector> us ...

  9. BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】

    题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include& ...

随机推荐

  1. 简洁JS 日历控件 支持日期和月份选择

    原文出处 以下这个JS日历控件是我的闲暇之余自己编写的,所有的代码全部在IE7/IE8/Firefox下面测试通过, 而且可以解决被iframe层遮盖的问题.现在只提供两种风格(简洁版和古典版)和两种 ...

  2. 手机端的表单验证和PC端的不同

    1.手机端:由于页面小的局限性,表单验证从上到下依次进行,如果上一个验证不通过,则给出错误提示,代码中return回去,不必进行下一个的校验: 2.PC端:页面范围大,一般是在表单的后面或者下面,提示 ...

  3. html 包含一个公共文件

    <SCRIPT> $(document).ready(function(){ $("#foo").load("top.html"); setTime ...

  4. UDP—Socket,套接字聊天简单的聊天程序。

    思路:(发送端) 1.既然需要聊天.就应该怎么建立聊天程序,,DatagramSocket对象http://www.w3cschool.cc/manual/jdk1.6/ DatagramSocket ...

  5. A题笔记(4)

    No. 1384 这题没啥 不过网考成绩出了,发现我的口语分数相较其他人还挺高的~~~哈哈哈 Code::Blocks 有时在程序运行结束后,.exe 并没有结束,因而之后无论怎么调试和修改代码,运行 ...

  6. Object-C 设计类接口

    在Object-C中,一个类通常分为两部分,.h头文件和.m实现文件. 类的接口(interface)通常存放在类似ClassName.h的文件中.在这里我们定义实例变量和公用(public)方法. ...

  7. iOS开发的技能树

    1.UI2.多线程 3.网络 4.多媒体 5.存储 6.分布式 7.支付,第三方 8.地图,动画,二维码,打包 9.特效10.apple watch/ apple tv 11.swift 12.web ...

  8. CSS Positioning(定位)

    Positioning(定位) CSS定位属性允许你为一个元素定位.它也可以将一个元素放在另一个元素后面,并指定一个元素的内容太大时,应该发生什么. 元素可以使用的顶部,底部,左侧和右侧属性定位.然而 ...

  9. Repeater 动态增加删除一行

    文章参考:文章参考http://www.cnblogs.com/dataadapter/archive/2012/06/25/2562885.html 效果: 前台代码: <%@ Page La ...

  10. js Dom树结构分析

    对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的) <!DOC ...