列表

详情


NC23929. wkroach is dream knight

描述

wkroach明天终于要去和那个女孩见面了,这天晚上在梦中他变成了一名骑士,然而wkroach毕竟是理工男,他变成的是棋盘上骑士,在梦醒之前他有N步移动的机会,wkroach想知道他总共可能有多少种走法呢。
这是一个8*8的棋盘,wkroach有一个初始位置,每次移动不能超出棋盘并且必须遵循骑士行走的规则也就和中国象棋的“马”类似但是不存在“蹩马腿”,如果你二者的规则都不知道那就看下一题吧)

输入描述

第一行输入一个正整数T代表测试样例数目
每组样例有三个正整数N R C(0<n<1000000000,0<R<9,0<C<9)代表此样例步数N及wkroach的初始点(R,C)。

输出描述

对于每组测试数据,输出一个整数,表示总走法数。

示例1

输入:

2
2 1 1
1000000000 1 1

输出:

12
71386775

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 406ms, 内存消耗: 872K, 提交时间: 2019-04-03 15:16:54

#pragma GCC optimize("O2,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
#define N 65
#define p 1000000007
#define int long long
#define num(i,j) ((i-1)*8+j)
using namespace std;

inline void rd(int &X){
    X=0;int w=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while( isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    X=w?-X:X;
}

int T;
int n,x,y;
int mx[]={-1,-2,-2,-1,1,2,2,1};
int my[]={-2,-1,1,2,2,1,-1,-2};

struct nd{int a[N][N];}t,b,s;

void build(){
    for(int x=1;x<=8;x++)
        for(int y=1;y<=8;y++)
            for(int i=0;i<8;i++){
                int tx=x+mx[i],ty=y+my[i];
                if(1<=tx and tx<=8 and 1<=ty and ty<=8)
                    s.a[num(x,y)][num(tx,ty)]=1;
            }
}
nd operator * (nd a,nd b){
    memset(t.a,0,sizeof t.a);
    for(int i=1;i<=64;i++)
        for(int j=1;j<=64;j++)
            for(int k=1;k<=64;k++)
                (t.a[i][j]+=a.a[i][k]*b.a[k][j])%=p;
    return t;
}
nd POW(nd a,int b){
    nd ans=a;b--;
    for(;b;b>>=1,a=a*a)
        if(b&1) ans=ans*a;
    return ans;
}
void work(){
    rd(n);rd(x);rd(y);
    memset(b.a,0,sizeof b.a);
    b.a[1][num(x,y)]=1;b=b*POW(s,n);
    int ans=0;
    for(int i=1;i<=64;i++)
        (ans+=b.a[1][i])%=p;
    cout<<ans<<endl;
}
signed main(){
    rd(T);build();while(T--)work();
}

C++11(clang++ 3.9) 解法, 执行用时: 158ms, 内存消耗: 620K, 提交时间: 2020-03-14 16:50:10

#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const LL MOD=1e9+7;
const int MAX_S=65;
const int f[][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
struct Matrix
{
	LL a[MAX_S][MAX_S];
	Matrix()
	{
		memset(a,0,sizeof(a));
	}
	Matrix operator*(const Matrix &A)
	{
		Matrix B=Matrix();
		for(int k=0;k<MAX_S;++k)
		for(int i=0;i<MAX_S;++i)
		for(int j=0;j<MAX_S;++j)
		B.a[i][j]=(B.a[i][j]+a[i][k]*A.a[k][j])%MOD;
		return B;
	}
};
int n,T;
Matrix e;
void Fast_power(Matrix &res,int n);
int main()
{
	e=Matrix();
	int t=0,x,y;
	for(int i=0;i<8;++i)
	for(int j=0;j<8;++t,++j)
	for(int k=0;k<8;++k)
	{
		x=i+f[k][0];
		y=j+f[k][1];
		if(x>=0&&x<8&&y>=0&&y<8) e.a[t][x*8+y]=1;
	}
	cin>>T;
	while(T--)
	{
		cin>>n>>x>>y;
		Matrix res=Matrix();
		t=(x-1)*8+y-1;
		for(int i=0;i<MAX_S;++i)
		res.a[t][i]=e.a[t][i];
		Fast_power(res,n-1);
		LL ans=0;
		for(int i=0;i<MAX_S;++i)
		for(int j=0;j<MAX_S;++j)
		ans=(ans+res.a[i][j])%MOD;
		cout<<ans<<endl;
	}
	return 0;
}
void Fast_power(Matrix &res,int n)
{
	Matrix A=e;
	while(n)
	{
		if(n&1) res=res*A;
		A=A*A;
		n>>=1;
	}
}

上一题