CodeForces 385E

来源:互联网 发布:js与java aes 编辑:程序博客网 时间:2024/05/16 00:37

题意:
有一个熊在n*n的森林里,初始位置在(sx,sy),每个位置都有growing raspberry
每个growing raspberry初始高度是x+y
然后每秒会先发生速度变化,假设当前位置是(x,y)
t=growing raspberry的高度
速度会从(vx,vy)->(vx+t,vy+t)
然后发生位置变化(x,y)->((x+vx-1)%MOD+1,(y+vy-1)%MOD+1)
然后growing raspberry高度++
问你t秒后熊的位置
思路:
先把x,y变成0~n-1便于取模
然后就是普通的矩阵快速幂
(x0,y0,t0,Vx0,Vy0,1)->
(X0+Vx0+X0+Y0+t0+2,y0+Vx0+X0+Y0+t0+2,t0+1,Vx0+X0+Y0+t0+2,Vy0+X0+Y0+t0+2,1)

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define lowbit(x) (x&(-x))typedef long long LL;const int maxn = 100005;const int inf=(1<<28)-1;#define Matrix_Size 10LL MOD;int Size;struct Matrix{    LL mat[Matrix_Size][Matrix_Size];    void clear()    {        memset(mat,0,sizeof(mat));    }    void output()    {        for(int i = 0;i < Size;i++)        {            for(int j = 0;j < Size;j++)                printf("%d ",mat[i][j]);            printf("\n");        }    }    Matrix operator *(const Matrix &b)const    {        Matrix ret;        for(int i = 0;i < Size;i++)            for(int j = 0;j < Size;j++)            {                ret.mat[i][j] = 0;                for(int k = 0;k < Size;k++)                {                    long long tmp = (long long)mat[i][k]*b.mat[k][j]%MOD;                    ret.mat[i][j] = (ret.mat[i][j]+tmp);                    if(ret.mat[i][j]>=MOD)                        ret.mat[i][j] -= MOD;                    if(ret.mat[i][j]<0)//注意是否需要MOD                         ret.mat[i][j] += MOD;                }            }        return ret;    }};Matrix pow_M(Matrix a,long long n){    Matrix ret;    ret.clear();    for(int i = 0;i < Size;i++)        ret.mat[i][i] = 1;    Matrix tmp = a;    while(n)    {        if(n&1)ret = ret*tmp;        tmp = tmp*tmp;        n>>=1;    }    return ret;}int Tmp[36]={2,1,1,1,0,2,1,2,1,0,1,2,0,0,1,0,0,1,1,1,1,1,0,2,1,1,1,0,1,2,0,0,0,0,0,1};int main(){    LL n,sx,sy,dx,dy,t;    scanf("%lld%lld%lld%lld%lld%lld",&n,&sx,&sy,&dx,&dy,&t);    MOD=n;    if(t==0)    {        printf("%lld %lld\n",sx,sy);        return 0;    }    sx--,sy--;    Size=6;    Matrix A,B;    A.clear();B.clear();    for(int i=0;i<6;++i)     for(int j=0;j<6;++j)     A.mat[i][j]=Tmp[i*6+j];    //A.output();printf("\n");    B.mat[0][0]=sx;B.mat[1][0]=sy;    B.mat[2][0]=0;B.mat[3][0]=dx;    B.mat[4][0]=dy;B.mat[5][0]=1;    A=pow_M(A,t);    A=A*B;    printf("%lld %lld\n",A.mat[0][0]+1,A.mat[1][0]+1);    return 0;}
0 0
原创粉丝点击