BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
2326: [HNOI2011]数学作业
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1564 Solved: 910
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
题解:
矩乘快速幂,构造矩阵:
其中k为位数,所以分段进行快速幂;
1~9;10~99;100~999;….
开始4A6W,然后加了快速乘AC了,但是YveH做的比我慢一些,没用快速乘也A了。。可能姿势不对?
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long n,m;
long long A[4][4],B[4][4];
long long quick_mul(long long x,long long y,long long p)
{
if (y==0) return 0;
if (y==1) return x%p;
long long re;
re=quick_mul(x,y>>1,p);
if ((y&1)==1) return (re+re+x)%p;
else return (re+re)%p;
}
void quick_pow(long long a[4][4],long long b[4][4],long long S[4][4])
{
long long tmp[4][4];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
{
tmp[i][j]=0;
for(int k=1;k<=3;k++)
tmp[i][j]=(tmp[i][j]+quick_mul(a[i][k],b[k][j],m))%m;
}
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
S[i][j]=tmp[i][j];
}
void work(long long t,long long end)
{
B[1][1]=t;
B[2][1]=B[2][2]=B[3][1]=B[3][2]=B[3][3]=1;
B[1][2]=B[1][3]=B[2][3]=0;
long long y=end-t/10+1;
while(y)
{
if(y&1) quick_pow(A,B,A);
quick_pow(B,B,B);
y>>=1;
}
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=3;i++) A[i][i]=1;
long long t=10;
while(n>=t) work(t,t-1),t*=10;
work(t,n);
printf("%lld",A[3][1]);
return 0;
}
BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘的更多相关文章
- BZOJ 2326 数学作业(分段矩阵快速幂)
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...
- BZOJ 2326: [HNOI2011]数学作业(矩阵乘法)
传送门 解题思路 NOIp前看到的一道题,当时想了很久没想出来,NOIp后拿出来看竟然想出来了.注意到有递推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1-i\)连接起 ...
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Input 输入文件只有一行为用空 ...
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...
- BZOJ 2326 数学作业(矩阵)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2326 题意:定义Concatenate(1,N)=1234567……n.比如Concat ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...
- 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】
目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...
- HDU 4549 矩阵快速幂+快速幂+欧拉函数
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
随机推荐
- Eclipse安装Database Development插件。
早期版本的Eclipse,自带Database Development,用着挺方便的,可是自己的最新版Eclipse反而没有.于是乎钻研了下,找到了安装方法.和汉化包安装很类似: 菜单栏里选择 ...
- Android使用的Eclipse NDK开发较详细一篇文章
转自: http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html
- 关于tcpdump抓包一个很详细的介绍
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
想必大家应该遇到过这样的情况,当点击Spinner控件后弹出的列表内容超多,一个一个滑动着去寻找所要的项很麻烦,尤其是当自己知道想要选择的内容,这时候如果我们只需要输入某些关键字,就可以讲上百条数据筛 ...
- Android service ( 一 ) 三种开启服务方法
一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟 Activ ...
- OXM
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...
- 挖Linux中的古老缩略语
[2005-06-22 15:23][Nigel McFarlane][TechTarget] <<阅读原文>> Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世 ...
- iBatis.Net(C#)SQL数据映射
转载请注明 http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html 摘要:本文探讨了iBatis.Net框架的XML数据映射文件各配置 ...
- C# MD5加密解密帮助类
/// <summary> /// MD5加密解密帮助类 /// </summary> public static class DESHelper { ...
- 极简反传(BP)神经网络
一.两层神经网络(感知机) import numpy as np '''极简两层反传(BP)神经网络''' # 样本 X = np.array([[0,0,1],[0,1,1],[1,0,1],[1, ...