给你三种正多面体,正四面体,正六面体,正八面体。求从某一种正多面体中的某一点走到另一个点,且步数不超过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的更多相关文章

随机推荐

  1. RESTful简介

    一.RESTful是什么? RESTful架构,就是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.Fielding将他对互联网软件的架构原则, ...

  2. 资产管理系统 CMDB 讲解

    两年前笔者在一个中小型互联网公司做运维,当时我们经理在机房,花了半天找一台服务器,但是服务器搞错了,悲剧了^.^! 当时我们的做法是用了一个 Excel,很多时候更新不及时,重启一台机器.拔一根网线都 ...

  3. Ansible详解(一)基础安装和配置

    ansible 是一款轻量级自动化运维工具,由的 Python 语言开发,结合了多种自动化运维工具的特性,实现了批量系统配置,批量程序部署,批量命令执行等功能; ansible 是基于模块化实现批量操 ...

  4. Async方法死锁的问题 Don't Block on Async Code(转)

    今天调试requet.GetRequestStreamAsync异步方法出现不返回的问题,可能是死锁了.看到老外一篇文章解释了异步方法死锁的问题,懒的翻译,直接搬过来了. http://blog.st ...

  5. 【Python学习笔记之三】lambda表达式用法小结

    除了def语句之外,Python还提供了一种生成函数对象的表达式形式.由于它与LISP语言中的一个工具很相似,所以称为lambda.就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了 ...

  6. Qt-网易云音乐界面实现-3 音乐名片模块的实现

    这个模块其实我是不知道该叫什么的,暂时就叫做音乐名片模块吧,这可以看到,这个模块简单的显示以下信息. 1. 歌曲名称 2. 歌曲歌唱者 3. 歌曲封面 4. 喜欢歌曲的按钮 5. 分享歌曲的按钮 6. ...

  7. C/S结构与B/S结构

    按照是否需要访问网络,程序可分为网络程序与非网络程序.其中网络程序又可分为B/S结构与C/S结构. C/S结构是指客户端(Client)/服务器(Server)模式,这种模式的客户端中 需要安装一个R ...

  8. java事物详解

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (iso ...

  9. CocoStuff—基于Deeplab训练数据的标定工具【四、用该工具标定个人数据】

    一.说明 本文为系列博客第四篇,主要讲述笔者在正式使用该工具使用自定义标签标注自己的图片的过程. 二.数据整理 相信大家已经在 *占坑

  10. 10.openldap备份与恢复

    备份方式 一.使用slapcat指令备份 使用slapcat备份后的数据 经过相关无用条目处理,即可实现数据上的条目备份 备份指令如下 #备份 #slapcat -v -l openldap-back ...