acdream 1093 女神的正多面体

http://acdream.info/problem?pid=1093


女神的正多面体

Time
Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB
(Java/Others)

SubmitStatistic Next Problem

Problem Description

EOF女神灰常喜欢整齐的东西,例如多面体中最喜欢的就是正多面体。正多面体的定义为:指每个面都是全等的正多边形的多面体。欧拉大人告诉我们,正多面体只有正四面体(正三棱锥),正六面体(立方体),正八面体(钻石?),正十二面体,还有正二十面体。后面两种太复杂了,EOF女神不喜欢。下面是前三种多面体的图片,EOF女神给每个多面体的每个顶点都编号了。

EOF女神想知道,如果从其中一个点出发,每一步可以沿着棱走到另一个顶点,k步之内从到达指定的顶点有多少种走法?(P.S.路径中只要有一个顶点不一样即视为不同的走法)。EOF女神知道结果会很庞大,因此只要知道除以1000000007的余数就可以了。

Input

先输入一个正整数T,表示测试数据的组数。

接下来是T行,每行包括四个正整数n,k,i,j,其中n∈{4,6,8},表示正多面体的种类,i为起点的编号,j为终点的编号,k为步数(k<=10^18)

Output

输出T行,每行输出一个整数,表示方法数。(记得要取余哦~)

Sample Input

3
6 1 8 4
6 2 3 1
8 3 2 4

Sample Output

1
2
12

Hint

第二组样例,有3->2->1与3->4->1两种方法

第三组样例,有2->1->4、2->3->4、2->5->4、2->6->4、2->1->3->4、2->1->5->4、2->3->1->4、2->3->6->4、2->5->1->4、2->5->6->4、2->6->3->4、2->6->5->4这12种方法

Source

mathlover

Manager

mathlover

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
const LL p = 1000000007;
struct Matrix
{
LL mat[3][9][9];
void init(int x,int n)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)mat[x][i][j]=1;
else mat[x][i][j]=0;
}
void mem(int x)
{
memset(mat[x],0,sizeof(mat[x]));
}
};
Matrix multiply(Matrix cur,Matrix ans,int x,int n)
{
Matrix now;
now.mem(x);
int i,j,k;
for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++)
{
if(cur.mat[x][i][k]==0)continue;
for(j=1;j<=n;j++)
{
if(ans.mat[x][k][j]==0)continue;
now.mat[x][i][j]=now.mat[x][i][j]+cur.mat[x][i][k]*ans.mat[x][k][j];
now.mat[x][i][j]%=p;
}
}
}
return now;
}
Matrix add(Matrix cur,Matrix ans,LL x,LL n)
{
Matrix now;
now.mem(x);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
now.mat[x][i][j]=ans.mat[x][i][j]+cur.mat[x][i][j];
if(now.mat[x][i][j]>=p) now.mat[x][i][j]-=p;
}
}
return now;
}
void solve(Matrix hxl,LL n,LL len,LL x,LL st,LL ed)
{
Matrix p1=hxl,p2=hxl,ret;
ret.init(x,len);
LL dp[64],dlen=0,i;
while(n)
{
dp[++dlen]=(n&1);
n=n>>1;
}
for(i=dlen-1;i>=1;i--)
{
p1=multiply(p1,add(p2,ret,x,len),x,len);
p2=multiply(p2,p2,x,len);
if(dp[i]==1)
{
p2=multiply(p2,hxl,x,len);
p1=add(p2,p1,x,len);
}
}
printf("%lld\n",p1.mat[x][st][ed]);
}
int main()
{
int T,i,j;
LL n,k,st,ed;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld",&n,&k,&st,&ed);
if(n==4)
{
Matrix hxl;
memset(hxl.mat,0,sizeof(hxl.mat));
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
if(i==j)continue;
hxl.mat[0][i][j]=1;
}
solve(hxl,k,4,0,st,ed);
}
else if(n==6)
{
Matrix hxl;
memset(hxl.mat,0,sizeof(hxl.mat));
hxl.mat[1][1][2]=1;hxl.mat[1][1][4]=1;hxl.mat[1][1][5]=1;
hxl.mat[1][2][1]=1;hxl.mat[1][2][3]=1;hxl.mat[1][2][6]=1;
hxl.mat[1][3][2]=1;hxl.mat[1][3][4]=1;hxl.mat[1][3][7]=1;
hxl.mat[1][4][1]=1;hxl.mat[1][4][3]=1;hxl.mat[1][4][8]=1;
hxl.mat[1][5][1]=1;hxl.mat[1][5][6]=1;hxl.mat[1][5][8]=1;
hxl.mat[1][6][2]=1;hxl.mat[1][6][5]=1;hxl.mat[1][6][7]=1;
hxl.mat[1][7][3]=1;hxl.mat[1][7][6]=1;hxl.mat[1][7][8]=1;
hxl.mat[1][8][4]=1;hxl.mat[1][8][5]=1;hxl.mat[1][8][7]=1;
solve(hxl,k,8,1,st,ed);
}
else if(n==8)
{
Matrix hxl;
memset(hxl.mat,0,sizeof(hxl.mat));
hxl.mat[2][1][2]=1;hxl.mat[2][1][3]=1;hxl.mat[2][1][4]=1;hxl.mat[2][1][5]=1;
hxl.mat[2][2][1]=1;hxl.mat[2][2][3]=1;hxl.mat[2][2][5]=1;hxl.mat[2][2][6]=1;
hxl.mat[2][3][1]=1;hxl.mat[2][3][2]=1;hxl.mat[2][3][4]=1;hxl.mat[2][3][6]=1;
hxl.mat[2][4][1]=1;hxl.mat[2][4][3]=1;hxl.mat[2][4][5]=1;hxl.mat[2][4][6]=1;
hxl.mat[2][5][1]=1;hxl.mat[2][5][2]=1;hxl.mat[2][5][4]=1;hxl.mat[2][5][6]=1;
hxl.mat[2][6][2]=1;hxl.mat[2][6][3]=1;hxl.mat[2][6][4]=1;hxl.mat[2][6][5]=1;
solve(hxl,k,6,2,st,ed);
}
}
return 0;
}

时间: 2024-11-10 06:58:57

acdream 1093 女神的正多面体的相关文章

ACdream 1093 女神的正多面体 矩阵快速幂

题目大意:给你三种正多边形,给你起点s,终点e以及最多行走的步数k,问有多少种路径方案(路径中只要有一个顶点不同即视为不同). 题目分析: 可以通过矩阵快速幂求解. 为每个正多边形(最多三个)构建一个邻接矩阵A,然后第K步的方案数即为A^k. 结果即为A^1 + A^2 + A^3 + ...... + A^k. 对于这种形式的矩阵运算,我们可以把它拆分成: k为奇:ans = (A^1 + A^2 + ... + A^(k/2)) + (A^1 + A^2 + ... + A^(k/2)) *

[ACdream] 女神教你字符串——三个气球

Problem Description 女神邀请众ACdream开联欢会,显然作为ACM的佼佼者,气球是不能少的~.女神准备了三种颜色的气球,红色,黄色,绿色(交通信号灯?) 有气球还不能满足女神,女神要在气球上写字. 写什么好呢~?字符串神马的最有爱了~ 女神先拿出一个字符串,然后把字符串的每一个真·前缀写到了黄色气球上面,每一个真·后缀写到了绿色气球上面,每一个真·子串写到了红色气球上面. 对于一个字符串s[1...n],真·前缀为s[1...i](1<=i<n)·,真·后缀为s[j...

[ACdream]女神教你字符串——导字符串

Problem Description 正如大家知道的,女神喜欢字符串,而在字符串中,女神最喜欢回文字符串,但是不是所有的字符串都是回文字符串,但是有一些字符串可以进行“求导”来变成回文字符串. 字符串中只包含小写字母.求导过程如下,C++: string dif(const string x) { if(x.length()<=1) return ""; string res=""; for(int i=1;i<x.length();++i) res+

[ACdream]女神教你字符串——违和感

题目描述: 女神最喜欢字符串了,字符串神马的最有爱了. 女神是一个重度强迫症患者,面对不是对称的东西,她会觉得太违和了,就会爆炸.所以她手上的字符串都是回文的,像什么a,b,aabaa,abcba,上海自来水来自海上...等等. 女神的人生理想就是把所有字符串都改造成回文串!这是非常宏伟的理想. 一切理想都从最简单的开始. 好了,现在女神面前有一堆字符串,然后请问能否通过删去一个字符,使这个字符串变成回文串? Input 多组数据,每组数据是一个字符串S,仅有英文小写字母组成 1<=|S|<=

跟Google 学代码 :Building Apps with Content Sharing(跟女神去表白)

本篇博客都讲了些什么? 1. Sharing Simple Data 共享简单的数据,如文本,图片,URI 2. Sharing Files 共享文件 3. Sharing Files with NFC无线传输 在写博客之前,假设 "我"是服务端App,我的"女神"是客户端App 情书是"我"想传递的数据 那么我该如何做呢? 向客户端App发送数据(暗送秋波篇) 对女神爱在心中口难开怎么办?如何示爱这是穷学生最纠结的心病 在Android 开发中

[转载] 程序员如何成功追到女神?

原载自:http://www.linuxeden.com/html/news/20151003/163105.html 今天我们谈一个你们这群单身狗已经掌握却一直没怎么用的技能:“追求女生”. 1.广泛涉猎恋爱技能,进行自学 交给你一个项目,遇到不会的开发工具怎么办?学啊!我们程序员拥有超强的自学能力. 星座,塔罗牌,看手相,大姨妈陪护,这些能引起女生共同话题的知识不要以为没有用,你就当学习一门新的编程语言嘛!一点都不难对不对? 要充分利用知识管理,我们不会谈恋爱,但是我们可以收集资源自学啊!我

“女神”列车夺全球最牛设计奖

明明可以靠脸吃饭,她却非要靠实力.在有着设计界"奥斯卡"之称的德国"红点"设计大赛上,西门子Velaro高速列车凭借高颜值与极强的实力,一举摘得2015年红点大奖桂冠!这可是全球设计精英心中的最高荣誉! 她是如何征服评委团的?小编这就来揭秘:揭密一 美貌与智慧并存的"女神"级列车 时下所谓新时代"女神",那都是上得厅堂.下得厨房.斗得过小三.打得过流氓.不过你知道么,如今的高铁圈也有"女神"标准:性能要强.

不允许在子查询的同时删除原表数据(ERROR 1093 (HY000))

delete from t where userid in (select userid from t where userid < 10); ERROR 1093 (HY000): You can't specify target table 't' for update in FROM clause delete from t where userid in (select userid from (select userid from t where userid < 10) tmp )

1093. Count PAT&#39;s (25)

The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters. Now given any string, you are supposed to tell the numb