P1397 [NOI2013]矩阵游戏
首先显然可以矩乘快速幂然后 $T$ 飞
看一眼题解发现因为这一题矩阵的特殊性所以可以对矩阵的次数欧拉降幂
然而我并不懂证明,所以我选择暴力乱搞的做法
十进制快速幂,然后注意一下常数,还有矩阵乘的顺序,别反了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e6+,mo=1e9+;
char n[N],m[N];
struct Matrix {
int a[][];
Matrix () { memset(a,,sizeof(a)); }
inline Matrix operator * (const Matrix &tmp) const {
Matrix res;
res.a[][]=(1ll*a[][]*tmp.a[][]+1ll*a[][]*tmp.a[][])%mo;
res.a[][]=(1ll*a[][]*tmp.a[][]+1ll*a[][]*tmp.a[][])%mo;
res.a[][]=(1ll*a[][]*tmp.a[][]+1ll*a[][]*tmp.a[][])%mo;
res.a[][]=(1ll*a[][]*tmp.a[][]+1ll*a[][]*tmp.a[][])%mo;
//循环展开优化常数
return res;
}
}F,G,Ans;
Matrix ksm(Matrix x,char *y)//十进制快速幂
{
Matrix res,t; res.a[][]=res.a[][]=;
for(int i=strlen(y+);i;i--)
{
t=x;
if(y[i]=='') { t=t*t; t=t*t; t=t*t; t=t*x; res=res*t; }
else if(y[i]=='') { t=t*t; t=t*t; t=t*t; res=res*t; }
else for(int j=;j<=y[i]-'';j++) res=res*x;
t=x; x=x*x; x=x*x; x=x*x; x=x*t; x=x*t;
}
return res;
}
void Minus(char *s)//把数减一
{
for(int i=strlen(s+);i;i--)
if(s[i]=='') s[i]='';
else { s[i]=s[i]-; break; }
}
int main()
{
int a,b,c,d; scanf("%s",n+); scanf("%s",m+);
a=read(),b=read(),c=read(),d=read();
Ans.a[][]=Ans.a[][]=;
F.a[][]=a; F.a[][]=b; F.a[][]=;
G.a[][]=c; G.a[][]=d; G.a[][]=;
Minus(n); Minus(m);
F=ksm(F,m); G=F*G; G=ksm(G,n);
Ans=Ans*G*F;
printf("%d\n",Ans.a[][]);
return ;
}
P1397 [NOI2013]矩阵游戏的更多相关文章
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
- 洛谷P1397 [NOI2013]矩阵游戏
矩阵快速幂+费马小定理 矩阵也是可以跑费马小定理的,但是要注意这个: (图是盗来的QAQ) 就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了 #include< ...
- 洛谷P1397 [NOI2013]矩阵游戏(十进制矩阵快速幂)
题意 题目链接 Sol 感觉做这题只要对矩阵乘法理解的稍微一点就能做出来对于每一行构造一个矩阵A = a 1 0 b列与列之间的矩阵为B = c 1 0 d最终答案为$A^{n - ...
- luogu P1397 [NOI2013]矩阵游戏
传送门 题目中那两个递推式显然可以写成矩乘的形式,然后十进制快速幂即可.这里不再赘述 只有两个递推式,我们可以考虑一波推式子,首先第一行的元素应该分别是\(1,a+b,a^2+ab+b,a^3+a^2 ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- BZOJ 3240: [Noi2013]矩阵游戏
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1586 Solved: 698[Submit][Status ...
- BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 123 Solved: 73 [ Submit][ St ...
- (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec M ...
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...
随机推荐
- PHPSESSID的cookie//session_start()
如果PHP脚本中有: 1 session_start(); 则说明使用了SESSION. SESSION是一种机制,可以在服务器端跨文件暂时保存数据或传递数据,常用于购物车等方面. SESSION只在 ...
- DH加密算法
http://blog.csdn.net/zbw18297786698/article/details/53609794
- 网络1911、1912 C语言第1次作业批改总结
一.评分规则 重点检查大家代码规范,变量名.大括号换行.缩进等发现不规范倒扣3分. 助教会进PTA查看大家代码的提交列表,发现不规范或抄袭,均扣分 每次作业完成后,至少邀请3个同学点评. 原作业地址: ...
- Error running 'Tomcat 9.0.241': port out of range:-1
这种情况很容易解决,别急. 修改默认配置,tomcat的server.xml检查一下,端口不能是-1, 一般会选80,或者1-65535之间的任意一个整数 路径:C:\Program Files\Ap ...
- redis high available solution/ redis 高可用方案
http://developers.linecorp.com/blog/?p=1420 http://engineering.docusign.com/articles/redis-sentinel- ...
- android 播放音乐媒体文件(二)
MediaPlayer使用 官方文档: https://developer.android.com/guide/topics/media/mediaplayer.html 示例代码: 首先网络音频资源 ...
- Libvirt 版本降级过程记录 4.5.0 to 3.9.0
前言 搞 OpenStack 开发 Libvirt 版本会随着 OpenStack 版本切来切去的,记录一下 Libvirt 从 4.5 降级到 3.9.0 的过程. 步骤 直接 downgrade ...
- resultMap的使用总结
Mybatis:resultMap的使用总结 resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素 ...
- 阶段3 2.Spring_09.JdbcTemplate的基本使用_4 JdbcTemplate的CRUD操作
复制demo起名3 保存 update delete selct 有这么多的重载方法 如何去定位 可变参数是JDK1.5版本之后才有的东西 RowMapper 实现RowMapper这个接口.然后实现 ...
- ABAP开发常用函数
1. LAST_DAY_OF_MONTHS——用于获取某月的最后一天. 例如输日今天的日期2013/10/16,系统将回执成2013年10月的最后一天,也就是2013/10/30 2. CONVE ...