連接:https://ac.nowcoder.com/acm/contest/551/F
來源:牛客網
c++
時間限制:C/C++ 2秒,其餘語言4秒
空間限制:C/C++ 524288K,其餘語言1048576K
64bit IO Format: %lld
空間限制:C/C++ 524288K,其餘語言1048576K
64bit IO Format: %lld
題目描述
CSL 有一個神奇的無窮實數序列,他的每一項知足以下關係:
對於任意的正整數 n ,有 n∑k=0akan−k=w^2 , 而且 a0=w。
CSL 很清楚這樣的序列是惟一的,他如今想考考你,你能快速告訴他這個序列的第 n 項是多少嗎?
對於任意的正整數 n ,有 n∑k=0akan−k=w^2 , 而且 a0=w。
CSL 很清楚這樣的序列是惟一的,他如今想考考你,你能快速告訴他這個序列的第 n 項是多少嗎?
爲了避免讓你感到難過,對每次詢問你只要輸出
2nn!2nn! 倍的 anan 對 998244353 取模後的結果便可。
輸入描述:
第一行有兩個整數 w 和 q ,其中 w 的含義如題意所述, q 表示接下來的詢問次數。
接下來的 q 行,每行輸入一個數 n 。
1≤w,n≤1061≤w,n≤106
1≤q≤1051≤q≤105
1≤q≤1051≤q≤105
輸出描述:
對於每一次詢問, 在一行輸出一個整數 v ,表示 v=2nn!⋅anmod 998244353v=2nn!⋅anmod 998244353
示例1
輸入
1 2 1 2
輸出
1 3
思路:看到題目有個2^n* n! * an 這種不常見的東西,猜想an跟2^n*n!有關
樣例中w=1時,打表發現當n=1時,an = a1 = 1/2,當n=2時,an = a2 = 3/8,首先猜了一發a_n = (2*n-1)/pow(2,2n-1)。打表後獲得第四項代入發現等式並不成立。
而後再猜了一下a_n = k/(2^n * n!)。。代入後發現這k就是個等比數列的乘積,即k = 1*3*5*....*(2n-1);
而後v就是k了,由於分母給消掉了。最後別忘了,在最開始的時候乘上w。
感覺:作成了打表找規律題海星,等題解的一手正解。
代碼:
#include<bits/stdc++.h> using namespace std; #define LL long long #define INF 2000000000 const LL mod = 998244353; LL d[1000001]; void init(LL w){ d[1] = w; for(int i = 2 ; i <= 1000000; i ++){ d[i] = (d[i-1] * (2*i-1))%mod; } } int main() { LL w,q; cin>>w>>q; init(w); while(q--){ LL n; cin >> n; cout<<d[n]<<endl; } }