// 3 2 T 3 2 T //由M计算(u ,u ,u,1) H M H (w ,w ,w,1) void CCoons:: uw(double M[][4],double Matrix[][4]) { double Temp[4][4]; double Hermite[4][4]={ { 2 ,-2 , 1 , 1}, {-3 , 3 ,-2 ,-1}, { 0 , 0 , 1 , 0}, { 1 , 0 , 0 , 0} }; double HermiteT[4][4]={ { 2 ,-3 , 0 , 1}, {-2 , 3 , 0 , 0}, { 1 ,-2 , 1 , 0}, { 1 ,-1 , 0 , 0} }; MatMultiply(Hermite,4,M,Temp); MatMultiply(Temp,4,HermiteT,Matrix); }
mat MatQuickPow(mat A,int n){ mat temp=E; while(n){ if(n&1) temp=MatMultiply(temp,A); n>>=1; A=MatMultiply(A,A); } return temp; }
static void make_transform_matrix( int transform_order, int rotate_order, double tx, double ty, double tz, double rx, double ry, double rz, double sx, double sy, double sz, double *transform) { int i; double T[16], R[16], S[16], RX[16], RY[16], RZ[16]; double *queue[3]; MatTranslate(T, tx, ty, tz); MatRotateX(RX, rx); MatRotateY(RY, ry); MatRotateZ(RZ, rz); MatScale(S, sx, sy, sz); switch (rotate_order) { case ORDER_XYZ: VEC3_SET(queue, RX, RY, RZ); break; case ORDER_XZY: VEC3_SET(queue, RX, RZ, RY); break; case ORDER_YXZ: VEC3_SET(queue, RY, RX, RZ); break; case ORDER_YZX: VEC3_SET(queue, RY, RZ, RX); break; case ORDER_ZXY: VEC3_SET(queue, RZ, RX, RY); break; case ORDER_ZYX: VEC3_SET(queue, RZ, RY, RX); break; default: assert(!"invalid rotate order"); break; } MatIdentity(R); for (i = 0; i < 3; i++) MatMultiply(R, queue[i], R); switch (transform_order) { case ORDER_SRT: VEC3_SET(queue, S, R, T); break; case ORDER_STR: VEC3_SET(queue, S, T, R); break; case ORDER_RST: VEC3_SET(queue, R, S, T); break; case ORDER_RTS: VEC3_SET(queue, R, T, S); break; case ORDER_TRS: VEC3_SET(queue, T, R, S); break; case ORDER_TSR: VEC3_SET(queue, T, S, R); break; default: assert(!"invalid transform order order"); break; } MatIdentity(transform); for (i = 0; i < 3; i++) MatMultiply(transform, queue[i], transform); }
int main() { int i,n,k,sum,max1,max2,a; E.m[0][0]=1;E.m[0][1]=0; E.m[1][0]=0;E.m[1][1]=1; A.m[0][0]=1;A.m[0][1]=1; A.m[1][0]=1;A.m[1][1]=0; while(scanf("%d%d",&n,&k)!=EOF){ sum=max1=max2=0; for(i=1;i<=n;i++){ scanf("%d",&a); if(a>max1){ max2=max1; max1=a; } else if(a>max2) max2=a; sum+=a; sum%=p; } B=MatQuickPow(A,k+1); B.m[0][0]--;B.m[1][1]--; B=MatMultiply(B,A); sum=(B.m[0][0]*max1%p+B.m[1][0]*max2%p+sum-max1+p)%p; printf("%d\n",sum); } return 0; }
/*========================= // 投影变换 // 参数:l,a // ===========================*/ void C3DPoint::project(double l,double ct) { double Temp1[1][4]={0,0,0,0}; double M_b[4][4]={ {1,0,0,0}, {0,1,0,0}, {l*cos(ct),l*sin(ct),0,0}, {0,0,0,1} }; MatMultiply (Matrix,1,M_b,Temp1); //Temp1->Matrix Matrix[0][0]=Temp1[0][0]; Matrix[0][1]=Temp1[0][1]; Matrix[0][2]=0; Matrix[0][3]=1; }
/*========================= // 绕Z轴旋转 // ===========================*/ void C3DPoint::Roat_z(double ct) { double Temp1[1][4]={0,0,0,0}; double M_b[4][4]={ {cos(ct),sin(ct),0,0}, {-sin(ct),cos(ct),0,0}, {0,0,1,0}, {0,0,0,1} }; MatMultiply (Matrix,1,M_b,Temp1); //Temp1->Matrix Matrix[0][0]=Temp1[0][0]; Matrix[0][1]=Temp1[0][1]; Matrix[0][2]=Temp1[0][2]; Matrix[0][3]=Temp1[0][3]; }
/*========================= // 透视 // ===========================*/ void C3DPoint::perspect(double x0,double y0,double z0) { double d=-z0; double Temp1[1][4]={0,0,0,0}; double M_b[4][4]={ {1,0,0,0}, {0,1,0,0}, {x0/d,y0/d,0,1/d}, {0,0,0,1} }; MatMultiply (Matrix,1,M_b,Temp1); //Temp1->Matrix Matrix[0][0]=Temp1[0][0]/Temp1[0][3]; Matrix[0][1]=Temp1[0][1]/Temp1[0][3]; Matrix[0][2]=0; Matrix[0][3]=1; }
/*========================= //旋转变换 //参数:int x1,y1,z1,x2,y2,z2 旋转直线, int ct 旋转角度 ===========================*/ void C3DPoint::Roat(int x1, int y1, int z1, int x2, int y2, int z2, double ct) { //求直线方向向量 double a=x2-x1; double b=y2-y1; double c=z2-z1; double tt=sqrt(double(a*a+b*b+c*c)); double n1=a/tt; double n2=b/tt; double n3=c/tt; //(n1,n2,n3) double v=sqrt(n2*n2+n3*n3); //cosa double c_na=n3/v; double c_a=c_na; //sina double s_na=n2/v; double s_a=-s_na; //cosb double c_nb=v; double c_b=c_nb; //sinb double s_nb=-n1; double s_b=s_nb; //Rx(a) double R_X[4][4]={ {1,0,0,0}, {0,n3/v,n2/v,0}, {0,-n2/v,n3/v,0}, {0,0,0,1} }; //Ry(B) double R_Y[4][4]={ {v,0,n1,0}, {0,1,0,0}, {-n1,0,v,0}, {0,0,0,1} }; //Rz(o) double R_Z[4][4]={ {cos(ct),sin(ct),0,0}, {-sin(ct),cos(ct),0,0}, {0,0,1,0}, {0,0,0,1} }; //Ry(-B) double R_NY[4][4]={ {v,0,-n1,0}, {0,1,0,0}, {n1,0,v,0}, {0,0,0,1} }; //Rx(-a) double R_NX[4][4]={ {1,0,0,0}, {0,n3/v,-n2/v,0}, {0,n2/v,n3/v,0}, {0,0,0,1} }; double Temp1[1][4]={0,0,0,0}; double Temp2[1][4]={0,0,0,0}; //平移到原点 Matrix[0][0]-=x1; Matrix[0][1]-=y1; Matrix[0][1]-=z1; MatMultiply (Matrix,1,R_X,Temp1); MatMultiply (Temp1,1,R_Y,Temp2); //backup Temp1 Temp1[0][0]=0; Temp1[0][1]=0; Temp1[0][2]=0; Temp1[0][3]=0; MatMultiply (Temp2,1,R_Z,Temp1); Temp2[0][0]=0; Temp2[0][1]=0; Temp2[0][2]=0; Temp2[0][3]=0; MatMultiply (Temp1,1,R_NY,Temp2); Temp1[0][0]=0; Temp1[0][1]=0; Temp1[0][2]=0; Temp1[0][3]=0; MatMultiply (Temp2,1,R_NX,Temp1); //Temp1->Matrix Matrix[0][0]=Temp1[0][0]; Matrix[0][1]=Temp1[0][1]; Matrix[0][2]=Temp1[0][2]; //从原点平移回 Matrix[0][0]+=x1; Matrix[0][1]+=y1; Matrix[0][2]+=z1; }