熊一开始在sx,sy位置,移动的速度为dx,dy,地图的范围是1~n,每次移动会到达x+dx,y+dy的位置,如果大于n,就%n+1
每次移动之前,假设时间为 t (从0开始),k=x+y+t,dx,dy会变为dx+k,dy+k
可以用矩阵实现移动,因为%n时只会产生0~n-1的数,所以干脆把坐标范围变成0~n-1
输入坐标后-1,输出坐标时+1,矩阵也要改动一下
X | 2 1 1 0 1 2 | X
Y | 1 2 0 1 1 2 | Y
dx | 1 1 1 0 1 2 | dx
dy | 1 1 0 1 1 2 | dy
t | 0 0 0 0 1 1 | t
1 | 0 0 0 0 0 1 | 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll MOD;
const int N=6;
struct node
{
ll a[10][10];
};
node shu,ans,mp;
//shu是输入的矩阵,ans是所求答案
node matrix(node x,node y)
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
mp.a[i][j]=0;
for(int p=1;p<=N;p++)
mp.a[i][j]=(mp.a[i][j]+(x.a[i][p]*y.a[p][j])%MOD+MOD)%MOD;
//矩阵乘法
}
return mp;
}
void work(ll k)
{//矩阵快速幂
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
ans.a[i][j]=0;
for(int i=1;i<=N;i++) ans.a[i][i]=1;
node t=shu;
while(k){
if(k&1)
ans=matrix(ans,t);
k>>=1;
t=matrix(t,t);
}
}
ll n,sx,sy,dx,dy,t;
int main()
{
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&n,&sx,&sy,&dx,&dy,&t);
if(t==0)
{
printf("%I64d %I64d\n",sx,sy);
}
else
{
MOD=n;
memset(shu.a,0,sizeof(shu.a));
shu.a[1][1]=shu.a[2][2]=2;
shu.a[1][2]=shu.a[1][3]=shu.a[1][5]=1;
shu.a[2][1]=shu.a[2][4]=shu.a[2][5]=1;
shu.a[3][1]=shu.a[3][2]=shu.a[3][3]=shu.a[3][5]=1;
shu.a[4][1]=shu.a[4][2]=shu.a[4][4]=shu.a[4][5]=1;
shu.a[5][5]=shu.a[5][6]=shu.a[6][6]=1;
shu.a[1][6]=shu.a[2][6]=2;
shu.a[3][6]=shu.a[4][6]=2;
work(t);
ll a[10];
a[1]=sx-1;a[2]=sy-1;a[3]=dx;a[4]=dy;a[5]=0;a[6]=1;
ll ex=0,ey=0;
for(int i=1;i<=6;i++)
ex=(ex+ans.a[1][i]*a[i]%MOD+MOD)%MOD;
for(int i=1;i<=6;i++)
ey=(ey+ans.a[2][i]*a[i]%MOD+MOD)%MOD;
printf("%I64d %I64d\n",ex+1,ey+1);
}
return 0;
}