Bear in the Field CodeForces - 385E

Bear in the Field CodeForces - 385E
思路:根据所给条件写出递推式。
fxn=f(xn-1)+d(xn-1)+k
k=xn-1+yn-1+2+t(n-1)
tn-1=t(n-2)+1
为了方便计算将1-n 变为0-n-1,初始时将x-1,y-1,又由于求k时候是原始位置x+y,所以为x+y+2;
得出递推矩阵

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll mod;
struct  matrix{
    ll x[7][7];
};
matrix multi(matrix a,matrix b){
    matrix temp;
    memset(temp.x,0,sizeof(temp.x));
    for(int i=0;i<6;i++)
        for(int j=0;j<6;j++)
            for(int k=0;k<6;k++)
            {
                temp.x[i][j]+=a.x[i][k]*b.x[k][j];
                temp.x[i][j]%=mod;
                if(temp.x[i][j]<0) temp.x[i][j]=(temp.x[i][j]+mod)%mod;
            }
    return temp;
}
matrix quick_multi(matrix a,ll n)//矩阵快速幂
{
    matrix temp=a;
    n--;
    while(n){
        if(n&1)
            temp=multi(temp,a);
        a=multi(a,a);
        n>>=1;
    }
    return temp;
}
int main()
{
    ll x,y,dx,dy,t;
    while(scanf("%lld%lld%lld%lld%lld%lld",&mod,&x,&y,&dx,&dy,&t)!=EOF)
    {
        matrix A,B;
        if(t==0) printf("%lld %lld\n",x,y);
        else
        {
            memset(A.x,0,sizeof(A.x));
            memset(B.x,0,sizeof(B.x));
            A.x[0][0]=A.x[0][5]=2,A.x[0][1]=A.x[0][2]=A.x[0][4]=1;
            A.x[1][0]=A.x[1][3]=A.x[1][4]=1;A.x[1][1]=A.x[1][5]=2;
            A.x[2][0]=A.x[2][1]=A.x[2][2]=A.x[2][4]=1;A.x[2][5]=2;//速度可能时负的
            A.x[3][0]=A.x[3][1]=A.x[3][3]=A.x[3][4]=1;A.x[3][5]=2;
            A.x[4][4]=A.x[4][5]=A.x[5][5]=1;
            A=quick_multi(A,t);
            B.x[0][0]=x-1;B.x[1][0]=y-1;B.x[2][0]=dx;B.x[3][0]=dy;B.x[5][0]=1;
            B=multi(A,B);
            printf("%lld %lld\n",B.x[0][0]+1,B.x[1][0]+1);
        }
    }
    return 0;

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/81835151