[HNOI 2011]数学作业
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]数学作业相关推荐
- GPT-3数学不及格,愁坏伯克利团队,于是他们出了12500道数学作业
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI GPT ...
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业 Time Limit: 10 Sec Memory Limit: 128 MB [Submit][Status][Discuss] Description Input 输入文件只有一行为用 ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- BZOJ 2742: [HEOI2012]Akai的数学作业
2742: [HEOI2012]Akai的数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 535 Solved: 226 [Submit] ...
- 幼儿园带括号算式口诀_幼儿园数学作业括号题型.doc
幼儿园数学作业括号题型 1 + 8 =( ) 1 + 3 =( ) 1 + 9 =( ) 1 + 2 =( ) 1 + 7 =( ) 1 + 10 =( ) 1 + 4 =( ) 1 + 11=( ) ...
- 线性代数二之矩阵加速DP——数学作业,Arc of Dream
矩阵加速 数学作业 description solution code Arc of Dream description solution code 数学作业 description solution ...
- bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2249 Solved: 1301 [Submit][St ...
- 2742: [HEOI2012]Akai的数学作业
Description 这里是广袤无垠的宇宙这里是一泻千里的银河 这里是独一无二的太阳系 这里是蔚蓝色的地球 这里,就是这里,是富饶的中国大陆! 这里是神奇的河北大地 这里是美丽的唐山 这里是神话般的 ...
- 初二数学作业能用计算机算吗,数学作业用计算器来计算,这种做法对吗?
原标题:数学作业用计算器来计算,这种做法对吗? 不要小瞧四则运算 小学阶段数的计算认知序 从学习认知序中你会发现,数的计算是伴随着数域的不断拓展反复学习四则运算,正是深化对于加减乘除含义的理解.这也是 ...
最新文章
- 选点(dfs序+LIS)
- 不可不知的Python模块: collections
- 树莓派3上安装kali后的相关配置kali(2)
- HDU 2865 Birthday Toy [Polya 矩阵乘法]
- 暑期 2021 | Serverless Devs 最全项目申请攻略来啦!
- 2019安恒七月月赛——MISC
- python sklearn 绘制决策树模型的节点图
- springboot情操陶冶-web配置(六)
- c语言构造数学模型步骤,数学建模的6个基本步骤
- python爬携程_Python crawler:对携程的航班数据进行抓取,python,爬虫,爬取
- 破解版抓包工具Charles教程(资源分享)
- 手机扫描二维码,下载apk
- 做好软件测试的关键是什么,做好测试计划和测试用例的工作的关键是什么?
- 动态代理ip的测试步骤有哪些?
- pygame中blit()的参数的说明以及脏矩形动画形成的简要说明
- android循环遍历assert,AppCrawler自动遍历工具
- 股票风险 股票交易上的投机行为往往十分危险。假设某股票行为十分怪异,每天不是涨停(上涨10%)就是跌停(下跌10%)。
- Hive学习—数据操作
- 20221228英语学习
- 各类通信协议归纳整理(偏硬件)
热门文章
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)
- ASP.NET2.0中themes、Skins轻松实现网站换肤!
- 漫步线性代数十五——余弦和投影
- usb接口 spec_USB连接器发展演变和趋势
- 【C++】 error C2572: 重定义默认参数
- 转载——Regression Tree 回归树
- mysql中in的使用
- Logistic 梯度法进行分类
- Excel--Solver安装和使用
- hp服务器增加raid卡,惠普ProLiant服务器Raid卡配置过程详解