当前位置: 代码迷 >> 综合 >> Codechef PARSIN
  详细解决方案

Codechef PARSIN

热度:21   发布时间:2024-01-11 19:08:14.0

题目大意

求以下的式子:
这里写图片描述
其中N很大,M<=30

Solution

首先列出dp方程
F(n,m)=ni=1F(n?i,m?1)×sin(i×x)
这是暴力,然后我们尝试将 sin(i×x) 变成其他东西

预备知识

二倍角公式:
cos(2α)=cos2(α)?sin2(α)=2cos2(α)?1
sin(2α)=2cos(α)sin(α)
和差化积:
cos(α+β)=cos(α)cos(β)?sin(α)sin(β)
sin(α+β)=sin(α)cos(β)+sin(β)cos(α)
根据三角函数定义:
sin2(α)+cos2(α)=1

推导

sin(i×x)={ sin((k?1)x+x)=cos(x)sin((k?1)x)+sin(x)cos((k?1)x)sin((k?2)x+2x)=cos(2x)sin((k?2)x)+sin(2x)cos((k?2)x)
2sin(k×x)=sin((k?1)x+x)+sin((k?2)x+2x)=cos(x)sin((k?1)x)+sin(x)cos((k?1)x)+cos(2x)sin((k?2)x)+sin(2x)cos((k?2)x)=cos(x)sin((k?1)x)+sin(x)cos((k?1)x)+2cos2(x)sin((k?2)x)?sin((k?2)x)+2cos(x)sin(x)cos((k?2)x)=cos(x)[sin((k?2)x)cos(x)+sin(x)cos((k?2)x)]+sin(x)cos((k?1)x)+2cos2(x)sin((k?2)x)?sin((k?2)x)+2cos(x)sin(x)cos((k?2)x)=3cos2(x)sin((k?2)x)+3cos(x)sin(x)cos((k?2)x)+sin(x)[cos((k?2)x)cos(x)?sin((k?2)x)sin(x)]?sin((k?2)x)=3cos2(x)sin((k?2)x)+4cos(x)sin(x)cos((k?2)x)?sin((k?2)x)?sin2(x)sin((k?2)x)=4cos2(x)sin((k?2)x)+4cos(x)sin(x)cos((k?2)x)?2sin((k?2)x)=4cos(x)[cos(x)sin((k?2)x)+sin(x)cos((k?2)x)]?2sin((k?2)x)=4cos(x)sin((k?1)x)?2sin((k?2)x)2sin(k×x)=4cos(x)sin((k?1)x)?2sin((k?2)x)sin(k×x)=2cos(x)sin((k?1)x)?sin((k?2)x)F(n,m)=ni=1F(n?i,m?1)×sin(i×x)=ni=2F(n?i,m?1)×sin(i×x)+F(n?1,m?1)×sin(x)=ni=2F(n?i,m?1)×2cos(x)×sin((i?1)x)?i=2F(n?i,m?1)×sin((i?2)x)+F(n?1,m?1)×sin(x)=2cos(x)×ni=2F(n?i,m?1)×sin((i?1)x)?i=2F(n?i,m?1)×sin((i?2)x)+F(n?1,m?1)×sin(x)=F(n?1,m)×2cos(x)?F(n?2,m)+F(n?1,m?1)×sin(x)

矩阵乘法

于是我们发现F(n,m)只与F(n-1,m),F(n-2,m),F(n-1,m-1)有关,于是我们可以用一个2m*2m的矩阵来做快速幂,最终就可以得出结果了。

。。。推到脑抽