ACdream1093
给你三种正多面体,正四面体,正六面体,正八面体。求从某一种正多面体中的某一点走到另一个点,且步数不超过k(1018)的方案数。
首先说明一下我交题的时候遇到的问题,起点和终点为同一点的时候,算不算走了零步到达了?题目没有算,如果考虑了交上去会wa。
题目解法是矩阵。
一开始通过观察这三种多面体,得出初始矩阵。 这里要细心。
显然我们可以通过矩阵乘法迅速地知道从一点到另一点走k步的方案数。假设矩阵是a[][],那么x->y的方案就是a[x][y]。
要求不超过k步的方案,就相当于前k个矩阵求和了(前k次方和)。因为矩阵有很多性质跟数是一样的,我们可以用类似的方法求解。
我也不知道自己用的是什么方法,反正这样写可以过。不过好像时间上不是最优的。
召唤代码君:
/*
* this code is made by 092000
* Problem: 1093
* Verdict: Accepted
* Submission Date: 2014-07-20 10:06:15
* Time: 592MS
* Memory: 1676KB
*/
#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long ll;
using namespace std; const int mod=;
ll k;
int n,I,J,T; int a4[][]={
{,,,},
{,,,},
{,,,},
{,,,},
}; int a6[][]={
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
}; int a8[][]={
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
{,,,,,,,},
}; struct mat{
ll a[][];
void init0()
{
memset(a,,sizeof a);
}
void init1()
{
init0();
for (int i=; i<n; i++) a[i][i]=;
}
void init(int x)
{
init0();
if (x==)
{
for (int i=; i<; i++)
for (int j=; j<; j++) a[i][j]=a4[i][j];
}
else if (x==)
{
for (int i=; i<; i++)
for (int j=; j<; j++) a[i][j]=a6[i][j];
}
else
{
for (int i=; i<; i++)
for (int j=; j<; j++) a[i][j]=a8[i][j];
}
}
}; mat add(mat e1,mat e2)
{
mat e0;
for (int i=; i<n; i++)
for (int j=; j<n; j++)
e0.a[i][j]=(e1.a[i][j]+e2.a[i][j])%mod;
return e0;
} mat mul(mat e1,mat e2)
{
mat e0;
e0.init0();
for (int i=; i<n; i++)
for (int j=; j<n; j++)
for (int k=; k<n; k++) e0.a[i][j]=(e0.a[i][j]+e1.a[i][k]*e2.a[k][j])%mod;
return e0;
} mat power(mat e,ll y)
{
mat e0;
e0.init1();
while (y)
{
if (y&) e0=mul(e0,e);
e=mul(e,e),y>>=;
}
return e0;
} int main()
{
mat ans,tmp,squ,E;
ll answer;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
scanf("%lld",&k);
scanf("%d",&I);
scanf("%d",&J);
//scanf("%d%lld%d%d",&n,&k,&I,&J);
if (n==) n=;
else if (n==) n=;
ans.init0();
tmp.init1();
squ.init1();
E.init(n);
while (k)
{
if (k&) ans=add(ans,mul(tmp,power(E,k)));
k>>=;
tmp=mul(tmp,add(power(E,k),squ));
}
answer=ans.a[I-][J-];
//if (I==J) answer++;
answer%=mod;
printf("%d\n",(int)answer);
}
return ;
}
ACdream1093的更多相关文章
随机推荐
- docker部署jenkins环境
首先获取jenkins的镜像: docker pull jenkins 设置jenkins_home映射: sudo mkidr -p /jenkins_home /jenkins_home 启动容器 ...
- DNS DHCP 路由 FTP
第1章 网络基础 1.1 IP地址分类 IP地址的类别-按IP地址数值范围划分 IP地址的类别-按IP地址用途分类 IP地址的类别-按网络通信方式划分 1.2 局域网上网原理过程 DHCP原理过程详情 ...
- Linux之服务器介绍
服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力. 服务器: 服务器指的是网络中能对其他机器提供某些服务的计算机系统 ...
- 树莓派UPS-18650,添加时钟
1.简介 UPS-18650 是一个专门为树莓派(以下简称 pi)所设计的 UPS 电源,采用两颗标准 的 18650 锂电池进行供电,支持外部电源插入检测,支持边充边放,既插上外部电源时, pi 由 ...
- Django 前后端不分离 代码结构详解
Demo: hello_pycharm 根目录文件:hello_pycharm [__init__.py __pycache__ settings.py urls.py wsgi.py] A ...
- django orm 操作表
django orm 操作表 1.基本操作 增 models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs inser ...
- Playfair加密
前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...
- ossec安装
安装 安装要求 对于Unix系统来说,OSSEC只需要GNU的make.gcc和libc.推荐使用OpenSSL,但仅属于一个可选项.而且,通常您只需在一个系统上做编译操作,然后将二进制程序复制到其他 ...
- 凡事不求甚解,遇事必定抓瞎——PHP开发Apache服务器配置备忘录
照此配置流程,绝对一路畅通,可保无虞. 昨天弄了个PHP小程序,想在本地跑一下测试,可是工作电脑没有安装环境,于是下载了一个wamp,一路畅通,Apache.Mysql.PHP就全有了.启动wamp服 ...
- iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)
iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...