给你三种正多面体,正四面体,正六面体,正八面体。求从某一种正多面体中的某一点走到另一个点,且步数不超过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. 用 Python 破解 WIFI 密码,走到哪里都能连 WIFI

    WIFI 破解,Python 程序员必学技能.WIFI 已经完全普及,现在 Python 程序员没网,走到哪里都不怕! 教你们一招,如何在图片中提取 Python 脚本代码.图片发送至手机 QQ 长按 ...

  2. 最具有性价比的语言javascript之介绍篇

    虽然最近几年javascript很火.但很多程序员对javascript重视程度不够,所以对javascript的高级应用不甚了解.认为javascript仅仅只是一门脚本语言,作用就是表单验证,网页 ...

  3. 如何创建XHTML表单

    首先奉上本菜曾经的作业——一张模仿智联招聘中的注册表单.虽然没有加样式显得很难看,但表单的基本要素已经具备了. 接下来进入正文,开始介绍各表单元素 form标签: 在创建表单时,第一步就是form标签 ...

  4. Qt-网易云音乐界面实现-7 消息中心实现,主要是QListWidget 自定义Item 和QTabwidget使用

    最近写的有点烦躁, 感觉内容真的很多!很多!很多. 目前真的想知道网易官方在出这款产品是,用了多少人和多长时间. 今天写的这个消息中心,有点糙,只是原理实现了没有完全复制过来,心里有团火,不想写了. ...

  5. unity灯光烘焙设置详解

    游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...

  6. 布线问题 (NYOJ38)

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...

  7. 013-- mysql常用的查询优化方法

    浅谈MySQL中优化sql语句查询常用的30种方法   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句 ...

  8. zabbix切换中文,监控图下方显示乱码,监控图X轴不显示时间问题解决(适用于所有版本)

    一.现象: abbix3.4安装好后添加zabbix图形,发现有好多方块 这是因为zabbix web程序缺少中文字体 二.解决方案1: 1.在windows系统找一个中文字体上传到服务器中,我这里找 ...

  9. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(二)

    本文接上一节是测试部分 搭建一个模拟测试环境 作者将fabric release1.2工程中的 example-e2e进行了改造来进行本次实验: (1)首先我们将examples/e2e_cli/sc ...

  10. nice和renice命令详解

    基础命令学习目录首页 进程调度是linux中非常重要的概念.linux内核有一套高效复杂的调度机制,能使效率极大化,但有时为了实现特定的要求,需要一定的人工干预.比如,你希望操作系统能分配更多的CPU ...