目錄給出 n, m, x,你需要求出下列式子的值:
\[\sum_^mk_i)=n}(\prod_^\sin(k_i*x))
\]其中 ki 為正整數。由於答案非常大,你只需要輸出答案(保證不為 0)的正負(如果是負數輸出負號,否則輸出正號)和從左往右第乙個非 0 數字上的數字即可。
input
第一行乙個整數 t 表示資料組數。
對於每組資料,每行有兩個整數 m,n 和乙個兩位小數 x。
對於 100%的資料,t ≤ 10,n ≤ 10^9,m ≤ 30。
output
輸出共 t 行,每行兩個字元表示答案。
sample input
23 5 0.01
3 6 0.02
sample output
+2+4
其實題目要你求解的說白了就是卷積。即對於多項式 \(f(p) = \sum_^\sin(i*x)p^i\),求 \(f^m(p)\) 中第 n 項的係數為多少。然而 n 最大可以為 10^9,fft 再怎麼優化也過不了。
我們發現對於這個卷積,我們想要得到的其實只有第 n 項的係數,其他項的係數並不重要,而 fft 必然要求出所有的係數,所以時間複雜度肯定降不下來。我們不得不換一種思路。
如果是一般多項式,fft 就是時間複雜度的下限。但是我們的係數是三角函式,也就是說,我們要利用三角函式的一些性質。
資料範圍 n <= 10^9,且物件是三角函式。如果熟悉的話,很容易想到三角函式的遞推式:
\[\sin kx = 2\cos x\sin(k-1)x -\sin(k-2)x
\]邊界為已知量 \(\sin 0, \sin x\)。 \(\cos x\) 是乙個我們可以預先知道的常數,這樣子就可以和矩陣乘法扯上關係了。
\[\sin kx = \sin x\cos (k-1)x+\cos x\sin (k-1)x
\]這個式子中的 \(\cos (k-1)x\) 是我們想要消去的,因此再對它使用一次和差公式。
\[\sin kx =\sin x\cos(k-2)x\cos x-\sin^2 x\sin(k-2)x + \cos x\sin (k-1)x
\]又出現了 \(\cos (k-2)x\)。但是,注意到其實可以把 \(\sin x\cos(k-2)x\) 當作乙個整體,而這個整體出現在 \(\sin (k-1)x\) 的和差公式中。
因此,我們把 \(\sin (k-1)x = \sin x\cos (k-2)x+\cos x\sin (k-2)x\) 變形代入上式。
\[\sin kx =\cos x\sin(k-1)x -\cos^2 x\sin(k-2)x-\sin^2 x\sin(k-2)x + \cos x\sin (k-1)x
\]恒等變形,就可以得到我們的結果:
\[\sin kx =2\cos x\sin(k-1)x -\sin(k-2)x
\]好的我們推完式子再回到我們剛剛的思路。
考慮幾種特殊情況吧。
當 m = 1 時,就是求 \(\sin nx\), 直接矩陣加速即可(當然最直接的還是暴力算)。
當 m = 2 時,令 \(g[i] = \sum_^(\sin(j*x)*\sin((i-j)*x))\),我們相當於是求 \(g[n]\)。
我們嘗試建立遞推關係。代入三角函式的遞推式得到(注意邊界情況的存在):
\[g[i] = \sin x*\sin((i-1)*x)+\sum_^((2\cos x\sin(j-1)x -\sin(j-2)x)\sin((i-j)*x))\\
=\sin x*\sin((i-1)*x)+2*\cos x*g[i-1]-g[i-2]\]
其中 \(\sin((i-1)*x)\) 雖然不是常數,但是也可以通過矩陣乘法得到。
更一般地,令 \(dp[i][j]\) 表示 j 個多項式卷積第 i 項的係數,我們可以得到如下的遞推關係:
\[\begindp[i][j]=\sin x*dp[i-1][j-1]+2*\cos x*dp[i-1][j]-dp[i-2][j] & i \geq 2 \\
dp[i][j] = \sin x & i = 1 且 j = 1\\
dp[i][j] = 0 & otherwise
\end\]
然後就可以矩陣加速了。
#include#includeconst int maxn = 30;
struct matrixm, b;
matrix operator * (matrix a, matrix b)
return ret;
}void solve()
else
}int main()
不得不說這道題還真的挺容易讓人走錯方向來著。
首先這是乙個卷積形式,一開始肯定是思考能不能用 fft(特別是像我一樣最近才入多項式這個坑什麼都想先來 fft 一下)。
然後 m 個正整數的和為 n,又是乙個組合數學的經典問題。這又是乙個大坑。
然後 sin(x),一樣是因為最近學了多項式,搞得我都想泰勒展開了……
當然如果你是神犇肯定不會像我一樣去想上面那些錯誤思路而是一眼就秒出了這道題的正解。
雅禮集訓6 23 T1 電報
每個點都只連向乙個點,所以最終的圖就是若干個基環樹,原問題等價於在基環樹中選出若干條互不相交的鏈,使鏈頂權值和最小,對每個基環樹dp即可。樹型dp 設dp i 表示點i及其子樹中的答案,mx i 表示max,son為i的兒子,那麼dp i dp son mx i c i 複雜度o n 環上dp 先列...
雅禮集訓 Day2 T3 聯盟 解題報告
text 國周邊的 n 個小國家構成乙個聯盟以抵禦 text 國入侵,為互相支援,他們建立了 n 1 條雙向通路,使得任意兩個國家可以經過通路相互到達.當乙個國家受到攻擊時,所有其它國家都會沿著最短路徑前往這個國家進行支援,經過每條通路所需的時間均為 1 定義乙個國家的危險程度為所有國家全部趕到需要...
雅禮集訓 Day1 T3 畫作 解題報告
小 mathrm 的喜歡作畫,尤其喜歡僅使用黑白兩色作畫.畫作可以抽象成乙個 r times c 大小的 01 矩陣.現在小 mathrm 構思好了他的畫作,準備動筆開始作畫.初始時畫布是全白的,他每一次下筆可以將乙個四聯通的部分塗成黑色或白色.你需要告訴他,在給出的構思下,他最少需要下筆多少次才能...