洛谷 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 ... 
随机推荐
- postman(一)批量执行接口测试用例
			postman(一)批量执行接口测试用例 学习了:https://blog.csdn.net/github_36032947/article/details/78611405 还可以把collecti ... 
- 【高级功能】使用 Ajax
			Ajax 是现代Web 应用程序开发的一项关键工具.它让你能向服务器异步发送和接收数据,然后用 Javascript 解析. Ajax 是 Asynchronous JavaScript and XM ... 
- Android 百度地图 简单实现---  美食搜索
			Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ... 
- jQuery中$().each与$.each的区别
			在jQuery中 $().each与$.each是不同的,$().each用于对jQuery对象做遍历操作处理,而$.each用于循环遍历一个Array或Object对象,相当于for或while循环 ... 
- hibernate学习系列-----(1)开发环境搭建
			其实一两个月前就在了解hibernate方面的知识了,但一直以来,都没有好好的总结,而且一直使用的是myeclipse,感觉有些傻瓜式的操作就可以搭建起hibernate的开发环境,但这样一点都不好, ... 
- Win7 无法将快捷方式从任务栏移除怎么办
			不知道是什么修改了系统的属性了.在网上找到了这个方法解决了:一:为了解决这个问题,你可以尝试下面的方法: 把以下命令分别输入到开始-运行中 1.cmd /k reg add "H ... 
- 使用Cocos studio创建一个简单的project
			前不久我接到了一个项目,项目要求使用Cocos2d-X的最新版本号,Cocos2d-X3.4.对于一直在陶醉在Cocos2d-X2.2.3的世界中的我开说,使用Cocos2d-X3.4忽然认为有点不适 ... 
- [译] ContentEditable 那些好的、坏的和坑
			译者注 我的上一篇译文 “[译] 通过 contentEditable 属性创建一个所见即所得的编辑器” 的原文 “Create a WYSIWYG Editor With the contentEd ... 
- Selenium3.14.1+Python安装和第一个Demo
			言简意赅的说下Selenium是什么 Selenium是前台测试框架,支持IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome等浏览器,我只 ... 
- linux之ftp命令详解
			我们在使用ftp客户端访问到ftp服务器之后,往往需要进行相关操作,比如从远程机器上下载文件,或者将文件传输到远程机器上.需要使用ftp的相关命令,本文讲述了ftp常用的一些操作. 方法/步骤 ... 
