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≤1018且1≤M≤109.

Output

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

Sample Input

13 13

Sample Output

4

题解

首先写出递推关系式:令 $s_i$ 为前 i 个数连接得到的数,$c(i)$ 表示 $i$ 的位数,有

$s_i=10^{c(i)}×s_{i−1}+i$

$c(i)$ 随 $i$ 变化,无法在转移矩阵 $T$ 中表示。如果 $c(i)$ 固定,就可以矩阵优化了!

考虑位数随着 $i$ 的变化最多只会变化 $18$ 次,因此可以按位数分段进行矩阵快速幂。
枚举位数,那么有

aaarticlea/png;base64,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ExPq1q2bscAf/vCH6667LuOr1IfXXHNNtWrVdt9994MOOghpZ555ZrYqX3zxBcWGDh2arYCeF4IAv0mdOnUC6nbt2vFjWUiVJJQRk0ayl995550ddtiB0Txx4kQ7DcApUatWrWuvvTaHeljx5JNPEr+Vscxxxx13xRVXZHyV+nDx4sUffPABs1f2i3MzKbVuvPHG3XbbLeMUOG9DKuAg8Nlnn/EbCdoPPfSQYDEIyOPEeIjYh5678sormQ40a9bstNNOs1N71tqrVq3Cz5tDvSOOOKJz585MbXKUyfuKfdjDDjuMLYK8JSlg/M733XdfIYVVJhsCderUufzyy3nbv39/lkTZiiXquZg0et39zDPP4IxGbxb4uJtKbsBXX3313HPPsZafPn06fxt9nn322QMOOACuzKYevwccJQj5NAE7ANBuaQMJsgESree47/n1wsV38803R0vzgLQtH5BciQ0IARxNLJkR3qhRI5w5BbYyfvx4eK158+Z5y+OQmTx58sKFC2moYcOG7IixHM5WC09uv379mH5Ci6YM3y42N/mavfbaa+eff34Ool+5ciVTG6wIOdKbUwwjRozAnVWpUqVsdgX9vCiQg1bGyC9WpRo1avTo0ePee+9ls/viiy9mZRCOnta2ojmptV2TWTECSD/99FPeDRw4cPvt83cfW1rdu3c/66yzJk2alFliytOnn366du3aL7zwQps2bdimxLcO2T366KMZKy5atKhBgwajR4/G5/Piiy8yTYZSDz30UL6Tb731Fv/uu+++GSuah3PnzuWPVq1a5SgTxCt2b/GZmEl9EPLzyiwK5LzSfCngTiV+0cuXL09HX3311b6oEW0h2jCOEAK4capUqcKAg8I4vZdNczwqTBW7det25JFH4tdmuFNlwIAB2cqb5yNHjqTY8OHDU4sR8sK8Mt3fTRNMcpmuvv3226nl0WrDhg2PPPIIotiOzNEi/EsZGs1WpkCPk1O9EI8ThZ944gna5QcpW7uBPi8K5EA1cYR7UemCCy4ATD5vvvlmONpa24pW92YkRONfyOLbb79FV1bQxnefUW+cUbvsskuLFi0uvPBCzqXUrFnzm2++yVjSeUhsYJ8+fZo2bUp0amrJLl26QD2DBg068cQTcXA5r9gdY2p81113pT7kLVoRaWQyALAAzNEopwl4y5yUWHo2H6DgMoUJnyKl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" alt="" />

这里在状态矩阵中加了一个永远为 $1$ 的值,用于辅助 $i$ 每次加一。

 #include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std; LL n,m;
struct mat
{
LL a[][];
mat(){for (int i=;i<;i++)for (int j=;j<;j++) a[i][j]=;}
mat operator * (const mat&b)
{
mat ans;
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
ans.a[i][j]=(ans.a[i][j]+(a[i][k]*b.a[k][j])%m)%m;
return ans;
}
}S; int main()
{
S.a[][]=S.a[][]=;
scanf("%lld%lld",&n,&m);
LL now=;
for (LL s=;now<n;s*=)
{
mat T;
T.a[][]=T.a[][]=T.a[][]=T.a[][]=;
T.a[][]=s%m;
LL nd=min(s-,n)-now;
while (nd)
{
if (nd&) S=S*T;
T=T*T;
nd>>=;
}
now=min(s-,n);
}
printf("%lld\n",S.a[][]);
return ;
}

[HNOI 2011]数学作业的更多相关文章

  1. codevs 2314 数学作业

    2314 数学作业 2011年省队选拔赛湖南  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小 C 数学成绩优异 ...

  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. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

    BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...

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

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

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

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

  7. P3216 [HNOI2011]数学作业 (矩阵快速幂)

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

  8. BZOJ 2742: [HEOI2012]Akai的数学作业

    2742: [HEOI2012]Akai的数学作业 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 226[Submit][S ...

  9. [HNOI2011]数学作业 --- 矩阵优化

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

随机推荐

  1. HIVE的常用操作(HQL)语句

    HIVE基本操作命令 创建数据库 >create database db_name; >create database if not exists db_name;//创建一个不存在的数据 ...

  2. 2017-2018-1 20155306 《信息安全系统设计基础》Mybash的实现

    2017-2018-1 20155306 <信息安全系统设计基础>Mybash的实现 要求: 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解 ...

  3. 冲刺总结随笔(Alpha)

    冲刺总结随笔 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.项目预期进展及现实进展 项目预期 ...

  4. 冲刺NO.9

    Alpha冲刺第九天 站立式会议 项目进展 项目已完成模块的模块测试工作开始进行.如学生基本信息模块和学生信用信息模块. 问题困难 框架的掌握存在一定的问题,导致项目的执行速度变慢.其他课程的作业占据 ...

  5. 201621123043 《Java程序设计》第2周学习总结

    1.本周学习总结 使用jdk文档查阅函数功能及代码 用switch语句是在每个case中可能在第一行是sc.nextLine;来给回车赋值: 在使用循环的时候要注意循环返回的条件,否则陷入死循环可能会 ...

  6. 使用genstring和NSLocalizedString实现App文本的本地化

    OS提供了简便的方法来实现本地化,其中用的最多的就是NSLocalizedString. 首先查看下NSLocalizedString是什么: #define NSLocalizedString(ke ...

  7. Faster R-CNN 的 RPN 是啥子?

     Faster R-CNN,由两个模块组成: 第一个模块是深度全卷积网络 RPN,用于 region proposal; 第二个模块是Fast R-CNN检测器,它使用了RPN产生的region p ...

  8. vue项目结构

    前言 我在 搭建vue项目环境 简单说明了项目初始化完成后的目录结构. 但在实际项目中,src目录下的结构需要跟随项目做一些小小的调整. 目录结构 ├── src 项目源码目录 │ ├── api 所 ...

  9. day-1 用python编写一个简易的FTP服务器

    从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...

  10. Golang学习--开篇

    最近开始接收一个新项目,是使用Golang写的,需要重新捡起Golang来,于是就有了这个系列博客. Golang的环境配置,我就不说了,让我们直接开始. Golang官网:https://golan ...