CSL 的神奇序列(“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
链接:https://ac.nowcoder.com/acm/contest/551/F
来源:牛客网
CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系:
对于任意的正整数 n ,有 n∑k=0akan−k=w2∑k=0nakan−k=w2 , 并且 a0=wa0=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
输出描述:
对于每一次询问, 在一行输出一个整数 v ,表示 v=2nn!⋅anmod 998244353v=2nn!⋅anmod 998244353
示例1
输入
1 2
1
2
输出
1
3
input
1 2
1
2
output
1
3
看图:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <deque>
#include <queue>
#include <stack>
#include <set>
using namespace std;
typedef long long ll;
const int MAX=998244353;
const int M=1e6+7;
ll a[M];
int main()
{
ll w,q,i,j,k;
cin>>w>>q;
a[0]=w;
ll p=1;
for(i=1;i<=M;i++)
{
a[i]=(a[i-1]%MAX*p%MAX)%MAX;//要用到同余定理
p+=2;
p%MAX;
}
while(q--)
{
cin>>k;
cout<<a[k]%MAX<<endl;
}
return 0;
}