【JZOJ5223】B
来源:互联网 发布:淘宝宝贝描述排版软件 编辑:程序博客网 时间:2024/06/07 01:03
Description
给定一个3*3的网格图,一开始每个格子上都站着一个机器人。每一步机器人可以走到相邻格子或留在原地,同一个格子上可以有多个机器人。问走n步后,有多少种走法,满足每个格子上都有机器人。答案对10^9+7取模。
Solution
话说这题除了正解并没有什么能得分的方法。
我们考虑一幅图
那我们对于这题给
那么当
于是我们矩阵快速幂求出
于是我们只要枚举每个机器人走到哪个格子就能统计答案。
时间复杂度:
Code
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define ll long long#define mo 1000000007#define N 13using namespace std;ll a[N][N],b[N][N],c[N][N];int tot=9;int fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};void mul(ll p[N][N],ll q[N][N]){ memset(c,0,sizeof(c)); fo(i,1,tot) fo(j,1,tot) fo(k,1,tot) c[i][j]=(c[i][j]+p[i][k]*q[k][j]%mo)%mo; memcpy(p,c,sizeof(c));}void pow(ll t){ fo(i,1,tot) b[i][i]=1; while(t) { if(t%2) mul(b,a); t/=2; mul(a,a); }}int g(int x,int y){ return (x-1)*3+y;}int ys[N],mp[N][N];int o[N];bool bz[N];ll ans=0;void dfs(int x){ if(x>tot) { ll tmp=1; fo(i,1,tot) tmp=tmp*mp[i][o[i]]%mo; ans=(ans+tmp)%mo; return; } fo(i,1,tot) if(!bz[i]) { bz[i]=true; o[x]=i,dfs(x+1); bz[i]=false; }}int main(){ freopen("B.in","r",stdin); freopen("B.out","w",stdout); ll n; scanf("%lld",&n); fo(i,1,3) fo(j,1,3) { int t=g(i,j); a[t][t]=1; fo(k,0,3) { int x=i+fx[k][0],y=j+fx[k][1]; if(x<1 || x>3 || y<1 || y>3) continue; a[t][g(x,y)]=1; } } pow(n); fo(i,1,tot) { ys[i]=1; fo(j,1,tot) fo(k,1,tot) mp[i][j]=(mp[i][j]+ys[k]*b[k][j]%mo)%mo; ys[i]=0; } dfs(1); printf("%lld",ans);}
阅读全文
1 0
- 【JZOJ5223】B
- 【jzoj5223】【GDOI2018模拟7.12】【B】【矩阵乘法】
- b
- b
- b
- //b
- B
- b
- B
- B
- B
- B
- b
- B
- B
- B
- B
- B
- 【Java TCP/IP Socket】服务端的实现(可连接oracle数据库)
- C++ Web 编程
- Android之Bitmap 一
- Java中类和方法修饰
- MySQL之——主从复制的配置
- 【JZOJ5223】B
- SberbankRussianHousingMarket数据挖掘比赛总结
- mvc与mvvm的爱恨情仇
- Rust : 独一无二的Some
- 淘淘商城系列(二)nginx服务器的安装
- SLAM中相机位姿求解(李群李代数)
- vxWorks中sysClkRateGet()返回系统时钟详解
- C++ Sort函数
- 银行系统