洛谷 P3216 [HNOI2011]数学作业
最近学了矩阵,kzj大佬推荐了我这一道题目。
乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分。
然后仔细分析了一波,发现蛮简单的。
结果全wa了,先看看下面的错误分析吧!
首先,设f[n]为最终答案,易得出$$ f[n]=f[n-1]*10+n$$
然后魔改一下:$$ f[n]=f[n-1]*10+n-1 => $$
10&0&0\\
1&1&0\\
1&1&1\\
\end{matrix}\]
信心一波过样例提交,0分。
心态炸了,仔细想了想,原来这个矩阵是会变化的。
假设n的位数为k。
所以矩阵也要改为:
$$\begin{matrix}
10^k&0&0\\
1&1&0\\
1&1&1\\
\end{matrix}\]
那么,矩阵会成长,怎么做呢,
我们可以分开处理,初始矩阵 \(f[0] => (0,0,1)\)
从1枚举位数,一直到\(length(n)-1\)位,一直乘\(10^k\)的矩阵\(9*10^{k-1}\)次。
最后处理\(length(n)\)位,乘以\(10^{length(n)}\)矩阵\(n-\sum_{k=1}^{length(n)}(9*10^{k-1})\)次。
献上巨弱的丑代码吧~
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int K=0;
ull n,m,len,p,tot;
ull f[]={0,0,0,1},t[4][4];
ull suan(ull,ull);
void fuyan();
void yuzhouzhou();
ull getpow(ull,ull);
string work();
string w=work();
int main() {;;;;;;;;;;;;;;;;;;}
ull suan(ull x,ull y)
{
ull d=0;
while (y) {
if (y&1) d=(d%m+x%m)%m;
x=(x%m+x%m)%m,y>>=1;
}
return d%m;
}
void fuyan()
{
ull d[4];
memcpy(d,f,sizeof(d));
memset(f,0,sizeof(f));
for (int i=1;i<=3;++i)
for (int j=1;j<=3;++j)
f[i]=(f[i]%m+suan(d[j]%m,t[j][i]%m))%m;
}
void yuzhouzhou()
{
ull d[4][4];
memcpy(d,t,sizeof(d));
memset(t,0,sizeof(t));
for (int i=1;i<=3;++i)
for (int j=1;j<=3;++j)
for (int k=1;k<=3;++k)
t[i][j]=(t[i][j]%m+suan(d[i][k]%m,d[k][j]%m))%m;
}
ull getpow(ull x,ull y)
{
ull d=x;
for (int i=1;i<y;++i) d*=10;
return d;
}
string work()
{
cin>>n>>m;
p=n;
while (p) ++len,p/=10;
for (int i=1;i<len;++i) {
p=getpow(9,i);
tot+=p;
t[1][1]=getpow(10,i);
t[1][2]=t[1][3]=t[2][3]=0;
t[2][1]=t[2][2]=t[3][1]=t[3][2]=t[3][3]=1;
while (p) {
if (p&1) fuyan();
yuzhouzhou(),p>>=1;
}
}
p=n-tot;
t[1][1]=getpow(10,len);
t[1][2]=t[1][3]=t[2][3]=0;
t[2][1]=t[2][2]=t[3][1]=t[3][2]=t[3][3]=1;
while (p) {
if (p&1) fuyan();
yuzhouzhou(),p>>=1;
}
cout<<f[1];
return "You succeeded,boy!";
}
洛谷 P3216 [HNOI2011]数学作业的更多相关文章
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- 洛谷P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- [bzoj2326] [洛谷P3216] [HNOI2011] 数学作业
想法 最初的想法就是记录当前 \(%m\) 值为cur,到下一个数时 \(cur=cur \times 10^x + i\) n这么大,那就矩阵乘法呗. 矩阵乘法使用的要点就是有一个转移矩阵会不停的用 ...
- [luogu P3216] [HNOI2011]数学作业
[luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 ...
- P3216 [HNOI2011]数学作业 (矩阵快速幂)
P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...
- P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
随机推荐
- CSS——如何清除浮动
众所周知,平时在写HTML代码时,难免少不了使用Float样式,这样一来,假使您没有清除浮动,那么有浮动元素的父元素容器将元素将无法自动撑开.换句简单好理解的话来说,假如你在写CODE时,其中div. ...
- HTTP常用的请求头和响应头
1.请求头 Connection:表示是否需要持久连接.若值为Keep-Alive,就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间.要实现这一点, ...
- ros之串口通信---imu
1.sudo apt-get install ros-kinetic-rosserial 或者sudo git clonegit://github.com/wjwwood/serial.git (开 ...
- 微信公众号开发之创建菜单栏代码示例(php)
思路很简单:就是先获取access_token,然后带着一定规则的json数据参数请求创建菜单的接口.废话不多讲,直接上代码. class Wechat { public $APPID="w ...
- kubernetes高级之动态准入控制
系列目录 动态准入控制器文档介绍了如何使用标准的,插件式的准入控制器.但是,但是由于以下原因,插件式的准入控制器在一些场景下并不灵活: 它们需要编译到kube-apiserver里 它们仅在apise ...
- Keepalived + MySQLfailover + GTIDs 高可用
架构图 10.1.1.207 mysql master + keepalived 10.1.1.206 mysql slave ( backup master ) + ke ...
- C# SqlBulkCopy类批量导入数据
特别注意 sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...
- Spring WebSocket Support官方文档+翻译
实时更新技术能够应用在很多场景中,比如在浏览器中聊天.股票报价.状态更新.现场直播.这些需求对时间的延迟性都很敏感,但是我们可以发现他们存在这共有的共性. 标准的HTTP请求,是一次请求对应一次相应. ...
- spring AOP pointcut expression表达式解析
Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.Pointcut可以有下列方式来定义或者通过& ...
- 03 Memcached内存分布机制
一:Memcached 内存分布机制 (1)把内存分配成slab 和不同大小的chunk.在跟据键值的大小在选择对应的chunk.这样可以减少最小的内存浪费,内存浪费是不可避免的.[把内存划分成若干个 ...