P3216 [HNOI2011]数学作业 (矩阵快速幂)
P3216 [HNOI2011]数学作业
题目描述
小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:
给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N) Concatenate(1..N) ModMod MM 的值,其中 Concatenate (1 .. N) Concatenate(1..N) 是将所有正整数 1, 2, …, N1,2,…,N 顺序连接起来得到的数。例如, N = 13N=13 , Concatenate (1 .. N)=12345678910111213Concatenate(1..N)=12345678910111213 .小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。
输入输出格式
输入格式:
从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足 1≤N≤10000001≤N≤1000000 ;100%的数据满足 1≤N≤10^{18}1≤N≤$ 10^18 \(
且 1≤M≤\) 10^9 \(1≤M≤1\) 0^9 $
.
输出格式:
输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N)Concatenate(1..N) ModMod MM 的值。
输入输出样例
输入样例#1:
13 13
输出样例#1:
4
递推式容易得到:$$ f[i+1]=f[i]*10^{k}+i+1 $$
范围 $ n<=10^{18} $
线性算法肯定TLE,那就考虑log的算法(快速幂或者倍增)
考虑把递推式转换成矩阵
递推式有三项
经验告诉我们,也许要用到\(3*3\)的矩阵
经过一系列 碰数,凑数,计算
我们得到矩阵
\begin{pmatrix} f[n],n,1 \end{pmatrix} \times \begin{bmatrix} 10^{k},0,0\\1,1,0\\1,1,1 \end{bmatrix} \]
从而可以得到
=\begin{pmatrix} f[1],1,1 \end{pmatrix} \times \begin{bmatrix} 10^{k},0,0\\1,1,0\\1,1,1\end{bmatrix}^{n-1}\]
ps:k是位数
k虽然是不确定的,但k的范围却很小 <=18
所以分开做就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
ll n,mod;
struct node {
ll m[4][4];
} ans,ss,a;
node mul(node x,node y) {
node c= {};
for(int i=1; i<=3; ++i)
for(int j=1; j<=3; ++j)
for(int k=1; k<=3; ++k)
c.m[i][j]=(c.m[i][j]+(x.m[i][k]*y.m[k][j])%mod)%mod;
return c;
}
void fpow(ll p) {
while(p) {
if(p&1) ans=mul(ans,ss);
ss=mul(ss,ss);
p>>=1;
}
}
int main() {
//全部开long long不要质疑
cin>>n>>mod;
ans.m[1][3]=a.m[1][1]=a.m[2][1]=a.m[2][2]=a.m[3][1]=a.m[3][2]=a.m[3][3]=1;
for(ll i=1,j; i<=n; i=j+1) {
j=i*10-1;
if(j>n) j=n;
a.m[1][1]=a.m[1][1]*(ll)10%mod;
ss=a;
fpow(j-i+1);
}
printf("%lld\n",ans.m[1][1]%mod);
return 0;
}
自己还是太弱,最后处理菜的要死
P3216 [HNOI2011]数学作业 (矩阵快速幂)的更多相关文章
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- [HNOI2011]数学作业 矩阵快速幂 BZOJ 2326
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NNN 和 MMM ,要求计算Concatenate(1..N) Concatenate (1 .. N) ...
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- [luogu P3216] [HNOI2011]数学作业
[luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 ...
- [ An Ac a Day ^_^ ] hdu 4565 数学推导+矩阵快速幂
从今天开始就有各站网络赛了 今天是ccpc全国赛的网络赛 希望一切顺利 可以去一次吉大 希望还能去一次大连 题意: 很明确是让你求Sn=[a+sqrt(b)^n]%m 思路: 一开始以为是水题 暴力了 ...
- P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- [HNOI2011]数学作业 --- 矩阵优化
[HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\; ...
- 洛谷P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)
传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...
随机推荐
- 异步通信----WebSocket
什么是WebSocket? WebSocket API是下一代客户端-服务器的异步通信方法.该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序.WebSocket目前 ...
- iOS中textbox文本框清除圆角
在iOS.Mac safari中,所有的textbox, select, checkbox都会被强制美化为圆角.但在特殊情况下需要清除圆角时发现iOS中使用以下传统的css无效: border-rad ...
- 前端 HTML body标签相关内容 常用标签 换行标签 br
换行标签 <br> <br>标签用来将内容换行,其在HTML网页上的效果相当于我们平时使用word编辑文档时使用回车换行. 在第一行中间加上br <!DOCTYPE ht ...
- mysql 开启profiling
mysql 开启profiling
- elasticsearch 6.0java api的使用
elasticsearch 6.0 中java api的使用 1:使用java api创建elasticsearch客户端 package com.search.elasticsearch; impo ...
- Apache下设置网站目录的访问权限
禁止用户对某一个目录及目录下文件的访问,仅允许本地访问 <Directory "/wwwroot/cert/"> Require local </Director ...
- python 多线程小练习
需求:有100个数据,启动5个线程,每个线程分20个数据,怎么把这20个数据分别传给每个线程. 1. 利用多线程实现 import threading nums = list(range(100)) ...
- selenium webdriver处理HTML5 的视频播放
import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.sele ...
- c++虚函数重写的权限问题
cbase.h: #ifndef CBASE_H #define CBASE_H #include<iostream> using std::cout; using std::endl; ...
- IN的另类写法
EXPLAIN SELECT * FROM `tcb_capital_log` WHERE id IN(66,79,47) EXPLAIN SELECT * FROM ( SELECT 66 AS i ...