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$ 次,因此可以按位数分段进行矩阵快速幂。
枚举位数,那么有

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

 1 #include<map>
 2 #include<cmath>
 3 #include<ctime>
 4 #include<queue>
 5 #include<stack>
 6 #include<cstdio>
 7 #include<string>
 8 #include<vector>
 9 #include<cstring>
10 #include<cstdlib>
11 #include<iostream>
12 #include<algorithm>
13 #define LL long long
14 #define RE register
15 #define IL inline
16  using namespace std;
17
18 LL n,m;
19 struct mat
20 {
21     LL a[3][3];
22     mat(){for (int i=0;i<3;i++)for (int j=0;j<3;j++) a[i][j]=0;}
23     mat operator * (const mat&b)
24     {
25         mat ans;
26         for (int i=0;i<3;i++)
27             for (int j=0;j<3;j++)
28                 for (int k=0;k<3;k++)
29                     ans.a[i][j]=(ans.a[i][j]+(a[i][k]*b.a[k][j])%m)%m;
30         return ans;
31     }
32 }S;
33
34 int main()
35 {
36     S.a[0][1]=S.a[0][2]=1;
37     scanf("%lld%lld",&n,&m);
38     LL now=0;
39     for (LL s=10;now<n;s*=10)
40     {
41         mat T;
42         T.a[1][0]=T.a[1][1]=T.a[2][1]=T.a[2][2]=1;
43         T.a[0][0]=s%m;
44         LL nd=min(s-1,n)-now;
45         while (nd)
46         {
47             if (nd&1) S=S*T;
48             T=T*T;
49             nd>>=1;
50         }
51         now=min(s-1,n);
52     }
53     printf("%lld\n",S.a[0][0]);
54     return 0;
55 }

转载于:https://www.cnblogs.com/NaVi-Awson/p/7265838.html

[HNOI 2011]数学作业相关推荐

  1. GPT-3数学不及格,愁坏伯克利团队,于是他们出了12500道数学作业

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI GPT ...

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

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

  3. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

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

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

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

  5. 幼儿园带括号算式口诀_幼儿园数学作业括号题型.doc

    幼儿园数学作业括号题型 1 + 8 =( ) 1 + 3 =( ) 1 + 9 =( ) 1 + 2 =( ) 1 + 7 =( ) 1 + 10 =( ) 1 + 4 =( ) 1 + 11=( ) ...

  6. 线性代数二之矩阵加速DP——数学作业,Arc of Dream

    矩阵加速 数学作业 description solution code Arc of Dream description solution code 数学作业 description solution ...

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

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2249  Solved: 1301 [Submit][St ...

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

    Description 这里是广袤无垠的宇宙这里是一泻千里的银河 这里是独一无二的太阳系 这里是蔚蓝色的地球 这里,就是这里,是富饶的中国大陆! 这里是神奇的河北大地 这里是美丽的唐山 这里是神话般的 ...

  9. 初二数学作业能用计算机算吗,数学作业用计算器来计算,这种做法对吗?

    原标题:数学作业用计算器来计算,这种做法对吗? 不要小瞧四则运算 小学阶段数的计算认知序 从学习认知序中你会发现,数的计算是伴随着数域的不断拓展反复学习四则运算,正是深化对于加减乘除含义的理解.这也是 ...

最新文章

  1. 选点(dfs序+LIS)
  2. 不可不知的Python模块: collections
  3. 树莓派3上安装kali后的相关配置kali(2)
  4. HDU 2865 Birthday Toy [Polya 矩阵乘法]
  5. 暑期 2021 | Serverless Devs 最全项目申请攻略来啦!
  6. 2019安恒七月月赛——MISC
  7. python sklearn 绘制决策树模型的节点图
  8. springboot情操陶冶-web配置(六)
  9. c语言构造数学模型步骤,数学建模的6个基本步骤
  10. python爬携程_Python crawler:对携程的航班数据进行抓取,python,爬虫,爬取
  11. 破解版抓包工具Charles教程(资源分享)
  12. 手机扫描二维码,下载apk
  13. 做好软件测试的关键是什么,做好测试计划和测试用例的工作的关键是什么?
  14. 动态代理ip的测试步骤有哪些?
  15. pygame中blit()的参数的说明以及脏矩形动画形成的简要说明
  16. android循环遍历assert,AppCrawler自动遍历工具
  17. 股票风险 股票交易上的投机行为往往十分危险。假设某股票行为十分怪异,每天不是涨停(上涨10%)就是跌停(下跌10%)。
  18. Hive学习—数据操作
  19. 20221228英语学习
  20. 各类通信协议归纳整理(偏硬件)

热门文章

  1. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)
  2. ASP.NET2.0中themes、Skins轻松实现网站换肤!
  3. 漫步线性代数十五——余弦和投影
  4. usb接口 spec_USB连接器发展演变和趋势
  5. 【C++】 error C2572: 重定义默认参数
  6. 转载——Regression Tree 回归树
  7. mysql中in的使用
  8. Logistic 梯度法进行分类
  9. Excel--Solver安装和使用
  10. hp服务器增加raid卡,惠普ProLiant服务器Raid卡配置过程详解