博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
探索(数学)(矩阵快速幂)(快速乘)
阅读量:5112 次
发布时间:2019-06-13

本文共 1927 字,大约阅读时间需要 6 分钟。

5bc5e86442937.png

5bc5e863bf587.png
5bc5e86377b77.png

一句话题意:三维空间划分四维空间,最多能划分成多少个部分。

我们直接想四维的不好想,但是一般这种题我们考虑从低维开始做起。

在经过手算之后我们可以发现:

\(f(x)\)为零维(点)切一维(线)最多划分的部分,递推式:\(f(x)=f(x-1)+1\)

\(g(x)\)为一维(线)切二维(平面)最多划分的部分,递推式:\(g(x)=g(x-1)+f(x-1)\)

\(k(x)\)为二维(平面)切三维(空间)最多划分的部分,递推式:\(k(x)=k(x-1)+g(x-1)\)

\(h(x)\)为三维(空间)切四维最多划分的部分,递推式:\(h(x)=h(x-1)+k(x-1)\)

那么我们很容易看出这是一个递推。但是因为数据范围很大,所以我们考虑构造矩阵进行矩阵快速幂加速运算。(不会打mathjax矩阵,只能凑合一下了)

1 1 0 0 0

0 1 1 0 0
0 0 1 1 0
0 0 0 1 1
0 0 0 0 1

然后初始矩阵[1,f(0),g(0),k(0),h(0)]

但是因为数据实在很大,矩阵快速幂进行乘的时候很可能炸long long,所以我们用快速乘来保证数在mod范围内。

代码如下:

#include
#include
#include
#include
#define MAXN 40using namespace std;long long n,m;long long f[MAXN];struct Node{long long t[MAXN][MAXN];};Node init;inline long long multi(long long x,long long y,long long mod){ long long ans=0; while(y) { if(y&1) ans=(ans+x)%mod; x=(x+x)%mod; y>>=1; } return ans%mod;}inline Node mul(Node x,Node y){ Node cur; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) cur.t[i][j]=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) for(int k=1;k<=5;k++) cur.t[i][j]=(cur.t[i][j]+multi(x.t[i][k],y.t[k][j],m))%m; return cur;}inline void solve(){ long long cur[MAXN]; memset(cur,0,sizeof(cur)); for(int j=1;j<=5;j++) for(int k=1;k<=5;k++) cur[j]=(cur[j]+multi(f[k],init.t[k][j],m))%m; for(int i=1;i<=5;i++) f[i]=cur[i];}int main(){ freopen("discover.in","r",stdin); freopen("discover.out","w",stdout); scanf("%lld%lld",&n,&m); f[1]=1; f[2]=1; f[3]=1; f[4]=1; f[5]=1; for(int i=1;i<=5;i++) init.t[i][i]=1; init.t[1][2]=1; init.t[2][3]=1; init.t[3][4]=1; init.t[4][5]=1; while(n) { if(n&1) solve(); init=mul(init,init); n>>=1; } printf("%lld\n",f[5]%m); return 0;}

转载于:https://www.cnblogs.com/fengxunling/p/9800905.html

你可能感兴趣的文章
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
秒杀9种排序算法(JavaScript版)
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>