CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

Description

小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:

给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

Input

从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足1≤N≤1000000;100%的数据满足$$1≤N≤10{18}且1≤M≤10{9}$$.

Output

输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。

Sample Input

13 13

Sample Output

4

Http

CJOJ:http://oj.changjun.com.cn/problem/detail/pid/1331

Luogu:https://www.luogu.org/problem/show?pid=3216

HYSBZ:https://vjudge.net/problem/HYSBZ-2326

Source

递推,矩阵

解决思路

根据题意,我们可以设出递推式f[i]=f[i-1]*Num[i]+i,其中Num[i]是i的位数。因为题目中数据范围很大,所以我们很自然地就想到了矩阵优化(如果读者您还不知道什么是矩阵、矩阵优化或是矩阵快速幂,可以到我的这一篇文章中阅读)

我们可以列出的矩阵递推式是:

\[F_i=F_{i-1}*T=\begin{bmatrix} f_{i-1}&i&1\\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix}* \begin{bmatrix} Num[i] & 0 & 0\\1 & 1&0 \\ 0& 1&1 \end{bmatrix} = \begin{bmatrix} f_i=f_{i-1}*Num[i] & i+1 & 1 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{bmatrix}
\]

但是这样有一个问题,这个递推矩阵T中有一个数是变量,这不符合我们要实现矩阵快速幂的要求,若直接相乘,就失去了我们用矩阵优化的意义。

于是我们再次观察题目,题目中表示了数字不会超过18位,那么我们就对每一位分情况进行矩阵乘法,如19时,T[0][0]为10,1099时T[0][0]为100,100~999时T[0][0]为1000,依次类推,分别进行快速幂计算,这样就能达到优化的目的了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long ll n,m; class Matrix//定义矩阵
{
public:
ll M[3][3];
Matrix()
{
memset(M,0,sizeof(M));
}
Matrix(ll Arr[3][3])
{
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘法操作
{
Matrix Ans;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%m)%m;
return Ans;
} int main()
{
cin>>n>>m;
ll now;
ll last=0;
ll a[3][3]={{0,1,1},{0,0,0},{0,0,0}};
ll b[3][3]={{0,0,0},{1,1,0},{0,1,1}};
Matrix A(a);
for (ll i=10;last<n;i=i*10)//分情况进行矩阵快速幂
{
b[0][0]=i%m;
Matrix B(b);
now=min(i-1,n)-last;//now是当前这么多位能到的最大数,如两位时是99-9=9,三位时是999-99=900,注意要与n取一次最小
//cout<<now<<' '<<last<<endl;
//system("pause");
while (now!=0)//矩阵快速幂
{
//cout<<now<<endl;
if (now&1)
A=A*B;
B=B*B;
now=now>>1;
}
last=min(i-1,n);//Last记录上次能到的最大数
}
cout<<A.M[0][0]<<endl;
return 0;
}

CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)的更多相关文章

  1. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  2. luogu P1216 [IOI1994][USACO1.5]数字三角形 Number Triangles (递推)

    链接:https://www.luogu.org/problemnew/show/P1216 题面: 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的 ...

  3. 【HNOI2011】数学作业 题解(递推+矩阵快速幂)

    题目链接 题目大意:求$1-n$所拼接起来的数$mod\ m$的值. ----------------------------------- 递推式子很好想:$f_i=f_{i-1}*10^{\lg ...

  4. uoj#453. 【集训队作业2018】围绕着我们的圆环(线性代数+递推)

    题面 传送门 题解 我对线代一无所知 如果下面有啥说错的地方请说出来省的我一辈子都搞不明白 如果你没看懂以下在讲什么不要紧,因为我也没看懂 首先,关于\(A\times B \equiv C \pmo ...

  5. 【Luogu】P1306斐波那契公约数(递推)

    题目链接 有个定理叫gcd(f(n),f(m))=f(gcd(n,m)) 所以递推就好了. #include<cstdio> #include<cstdlib> #includ ...

  6. 数学--组合数学--当C(n,m)中n固定m++的递推模板

    ll power(ll a, ll b, ll p) { ll ans = 1 % p; for (; b; b >>= 1) { if (b & 1) ans = ans * a ...

  7. [luogu P3216] [HNOI2011]数学作业

    [luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 ...

  8. CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

    CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...

  9. BZOJ2339[HNOI2011]卡农——递推+组合数

    题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...

随机推荐

  1. 《实战java高并发程序设计》源码整理及读书笔记

    日常啰嗦 不要被标题吓到,虽然书籍是<实战java高并发程序设计>,但是这篇文章不会讲高并发.线程安全.锁啊这些比较恼人的知识点,甚至都不会谈相关的技术,只是写一写本人的一点读书感受,顺便 ...

  2. web工作过程

    了解浏览器与服务器进行通信和访问的过程 打开浏览器-输入URL地址 当我们访问一个网页时,如http://www.baidu.com,这个网址包含四个部分的内容: 1.第一部分:协议类型:这里是htt ...

  3. 一个html页面传入参数到另一个html页面用js获取方法

    没错使用以下函数就能够完整的获取到路径里的你想要的参数:function getURLParameter(name) { return decodeURIComponent((new RegExp(' ...

  4. 关于python编译的一点小结

    大家都知道python是脚本语言,源码可以直接执行,有时需要提高执行效率或者保密(因为有时候不想让使用人看到源码文件),那就涉及到python编译了,那么该如何做呢? 有两种方法可以做到. 1.一种是 ...

  5. DOM知识梳理

    DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...

  6. Unity3d: 资源释放时存储空间不足引发的思考和遇到的问题

    手机游戏第一次启动基本上都会做资源释放的操作,这个时候需要考虑存储空间是否足够,但是Unity没有自带获取设备存储空间大小的 接口,需要调用本地方法分别去android或ios获取,这样挺麻烦的.而且 ...

  7. [Leetcode] Sort, Hash -- 274. H-Index

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  8. java实现发送邮件

    前言:先引入javamail用到的jar包, 自己下载http://fhed.v061.10000net.cn/gulili198509051s/newjspkongjian/ueditor/jsp/ ...

  9. mysql主键约束和唯一性约束

    主键约束和唯一性约束都是索引,它们的区别是: 主键字段可以确保唯一性,但主键字段不能为NULL. 唯一性约束可以确保唯一性,但唯一性约束的字段可以为NULL 唯一性约束对含有NULL的记录不起作用,即 ...

  10. 匿名属性 anonymous property

    利用匿名属性可以用很简洁的语法来自动声明不可变(immutable)的元组(tuple)类型. 属性:在字段用来表示类型和对象的状态的前提下,希望状态不被随意的更改,字段一般应该设置为private, ...