推完一波式子之后发现是个矩阵23333.
其实只要发现是矩阵之后就是个水题了。
#include<bits/stdc++.h> #define ll long long using namespace std; int tp; struct node{ double a[65][65]; inline void clear(){ for(int i=0;i<65;i++) for(int j=0;j<65;j++) a[i][j]=0; } node operator *(const node &u)const{ node r; r.clear(); for(int k=1;k<=tp;k++) for(int i=1;i<=tp;i++) for(int j=1;j<=tp;j++) r.a[i][j]+=a[i][k]*u.a[k][j]; return r; } }x,ans; int n,m,T; double P,SIN,COS; inline void build(){ x.clear(); for(int i=1;i<=m;i++){ x.a[i][i]=COS,x.a[i][i+m]=-SIN; x.a[i+m][i]=SIN,x.a[i+m][i+m]=COS; if(i>1){ x.a[i-1][i+m]=COS; x.a[i+m-1][i+m]=SIN; } } } inline double solve(){ ans.clear(); for(int i=1;i<=tp;i++) ans.a[i][i]=1.00; for(;n;n>>=1,x=x*x) if(n&1) ans=ans*x; return ans.a[m+1][m]; } int main(){ // freopen("sine.in","r",stdin); // freopen("sine.out","w",stdout); scanf("%d",&T); while(T--){ scanf("%d%d%lf",&m,&n,&P),tp=m<<1; SIN=sin(P),COS=cos(P),build(); printf("%lf ",solve()); } return 0; }