bzoj 2326: [HNOI2011]数学作业
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define ll long long
ll b[],x[][],y[][],n,a[],ans,ans1,m;
void cheng(ll q[][],ll q1[][])
{
ll q2[][];
memset(q2,,sizeof(q2));
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
q2[i][j]=(q2[i][j]+(q[i][k]*q1[k][j])%m)%m;
for(int i=;i<;i++)
for(int j=;j<;j++)
q[i][j]=q2[i][j];
return;
}
int main()
{
scanf("%lld%lld",&n,&m);
b[]=;
for(int i=;i<=;i++)
{
b[i]=(b[i-]*);
if(n>=b[i])
a[]=i;
}
a[]++;
if(n<)
a[]=n;
else
a[]=;
for(int i=;i<a[];i++)
a[i]=a[i-]*;
if(n>=)
a[a[]]=n-b[a[]-]+;
for(int i=;i<=a[];i++)
{
memset(x,,sizeof(x));
x[][]=x[][]=x[][]=x[][]=x[][]=;
memset(y,,sizeof(y));
x[][]=b[i]%m;
y[][]=y[][]=y[][]=;
ll k=a[i];
for(;k;)
{
if(k%)
cheng(y,x);
cheng(x,x);
k/=;
}
ans=(y[][]+(y[][]*ans1)%m+(y[][]*ans)%m)%m;
ans1=(y[][]+(ans1*y[][])%m)%m;
}
printf("%lld\n",ans);
return ;
}
这是个矩阵乘法 对相同的位数构建一个矩阵。
bzoj 2326: [HNOI2011]数学作业的更多相关文章
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...
- bzoj 2326: [HNOI2011]数学作业【dp+矩阵快速幂】
矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式, ...
- BZOJ 2326: [HNOI2011]数学作业(矩阵乘法)
传送门 解题思路 NOIp前看到的一道题,当时想了很久没想出来,NOIp后拿出来看竟然想出来了.注意到有递推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1-i\)连接起 ...
- 2326: [HNOI2011]数学作业 - BZOJ
首先是DP,分段DP(按位数讨论) 然后每一段构造出它对应的矩阵,用矩阵快速幂加速 type matrix=..,..]of int64; var n,m:int64; a,b,c,d:matrix; ...
- 【bzoj】2326 [HNOI2011]数学作业
[题意]给定n和m,求1~n从高位到低位连接%m的结果.n=11时,ans=1234567891011%m.n<=10^18,m<=10^9. [算法]递推+矩阵快速幂 [题解] 考虑枚举 ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- [luogu P3216] [HNOI2011]数学作业
[luogu P3216] [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 ...
- P3216 [HNOI2011]数学作业 (矩阵快速幂)
P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...
随机推荐
- mysql概要(十二)事务
1.特性 2.开启结束取消事务:需要选择支持事务的引擎 3,隐式提交事务: 4.事务的隔离级别:
- 刻录DVD_待整理
1.各种 IDE 2. 3. 4. 5.
- 使用ioctl“实现”自定义的系统调用
http://www.educity.cn/Linux/1242138.html 最近做的项目跟Linux内核的关系比较大,我们的项目需要在用户态触发一些内核态的代码运行.众所周知,内核态的代码是不能 ...
- mysql复制的配置
# 78服务器 server-id=78 # 从哪个数开始 auto_increment_offset=1 # 每次增加多少 auto_increment_increment=2 log-bin=m ...
- Linux命令之nslookup
http://www.computerhope.com/unix/unslooku.htm About nslookup The nslookup command is used to query i ...
- 杨辉三角 && 鸽兔同校
杨辉三角: 用个一维数组直接模拟就行,只是 C++ 的高精度调了好久,后来发现能用 python ,于是试着写了写: dp = [] def out(L, end): for i in range(e ...
- Linux数字权限解释
linux系统文件夹644.755.777权限设置详解 ,左至右,第一位数字代表文件所有者的权限,第二位数字代表同组用户的权限,第三位数字代表其他用户的权限. 而具体的权限是由数字来表示的,读取的权限 ...
- Memcached使用入门
转:http://www.linuxidc.com/Linux/2011-12/49516.htm http://blog.csdn.net/wxwzy738/article/details/2370 ...
- Sql Server中通配符的使用
Sql Server中通配符的使用 通配符_ "_"号表示任意单个字符,该符号只能匹配一个字符."_"可以放在查询条件的任意位置,且只能代表一个字符.一个汉字只 ...
- libCEF总结01下载、编译、入门
目 录 第1章 下载 1 1.1 下载 1 1.2 合并 1 第2章 cmake 4 2.1 编译简介 4 2.2 下载cmake 4 2.3 运行cmake ...