Codechef PARSIN

来源:互联网 发布:字符串转化为数组 编辑:程序博客网 时间:2024/06/05 05:29

题目大意

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

Solution

首先列出dp方程
F(n,m)=ni=1F(ni,m1)×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((k1)x+x)=cos(x)sin((k1)x)+sin(x)cos((k1)x)sin((k2)x+2x)=cos(2x)sin((k2)x)+sin(2x)cos((k2)x)
2sin(k×x)=sin((k1)x+x)+sin((k2)x+2x)=cos(x)sin((k1)x)+sin(x)cos((k1)x)+cos(2x)sin((k2)x)+sin(2x)cos((k2)x)=cos(x)sin((k1)x)+sin(x)cos((k1)x)+2cos2(x)sin((k2)x)sin((k2)x)+2cos(x)sin(x)cos((k2)x)=cos(x)[sin((k2)x)cos(x)+sin(x)cos((k2)x)]+sin(x)cos((k1)x)+2cos2(x)sin((k2)x)sin((k2)x)+2cos(x)sin(x)cos((k2)x)=3cos2(x)sin((k2)x)+3cos(x)sin(x)cos((k2)x)+sin(x)[cos((k2)x)cos(x)sin((k2)x)sin(x)]sin((k2)x)=3cos2(x)sin((k2)x)+4cos(x)sin(x)cos((k2)x)sin((k2)x)sin2(x)sin((k2)x)=4cos2(x)sin((k2)x)+4cos(x)sin(x)cos((k2)x)2sin((k2)x)=4cos(x)[cos(x)sin((k2)x)+sin(x)cos((k2)x)]2sin((k2)x)=4cos(x)sin((k1)x)2sin((k2)x)2sin(k×x)=4cos(x)sin((k1)x)2sin((k2)x)sin(k×x)=2cos(x)sin((k1)x)sin((k2)x)F(n,m)=ni=1F(ni,m1)×sin(i×x)=ni=2F(ni,m1)×sin(i×x)+F(n1,m1)×sin(x)=ni=2F(ni,m1)×2cos(x)×sin((i1)x)i=2F(ni,m1)×sin((i2)x)+F(n1,m1)×sin(x)=2cos(x)×ni=2F(ni,m1)×sin((i1)x)i=2F(ni,m1)×sin((i2)x)+F(n1,m1)×sin(x)=F(n1,m)×2cos(x)F(n2,m)+F(n1,m1)×sin(x)

矩阵乘法

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

。。。推到脑抽

2 0
原创粉丝点击