某考试 T3 sine

推完一波式子之后发现是个矩阵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;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8547887.html