NC218216. 卷积
描述
给定两个长度为 n 的数列 和 ,定义序列 满足 。
其中 表示自然数集合 S 中未出现的最小的自然数。
请你求出序列 c 的值,对 998244353 取模。
输入描述
第一行一个数字 n;
接下来两行各 n 个数,代表序列 a,b。
输出描述
一行 n 个整数,代表序列 c。
示例1
输入:
3 1 1 1 1 1 1
输出:
4 3 2
示例2
输入:
5 1 2 0 1 9 0 2 1 1 0
输出:
48 2 2 0 0
C++(clang++11) 解法, 执行用时: 103ms, 内存消耗: 2068K, 提交时间: 2021-05-07 21:15:14
#include<iostream> #include<cstdio> using namespace std; #define int long long const int N=100005; const int M=998244353; int n,a[N],b[N],sa=0,sb=0; signed main(){ cin>>n; for(int i=0;i<n;++i){cin>>a[i];if(i>1) sa=(sa+a[i])%M;} for(int i=0;i<n;++i){cin>>b[i];if(i>1) sb=(sb+b[i])%M;} printf("%lld %lld %lld",((sa+a[1])*(sb+b[1]))%M,((sa*b[0]%M)+(sb*a[0]%M)+(a[0]*b[0]%M))%M,(a[0]*b[1]+a[1]*b[0])%M); for(int i=3;i<n;++i) cout<<" 0"; return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 316ms, 内存消耗: 47320K, 提交时间: 2021-04-09 22:05:34
n = int(input()) a = list(map(int, input().split())) b = list(map(int, input().split())) c = [0]*n c[0] = sum(a[1:])*sum(b[1:])%998244353 for j in range(2,n): c[1] = (c[1] + a[0]*b[j])%998244353 for k in range(2,n): c[1] = (c[1] + b[0]*a[k])%998244353 c[1] = (c[1] + a[0]*b[0])%998244353 c[2] = (a[0]*b[1] + a[1]*b[0])%998244353 for i in range(n): print(c[i],end=' ')
Python3(3.9) 解法, 执行用时: 112ms, 内存消耗: 18804K, 提交时间: 2021-04-09 20:26:49
n = int(input()) a = list(map(int,input().split())) b = list(map(int,input().split())) c = [0]*n c[2] = a[0]*b[1]+a[1]*b[0] c[1] = a[0]*sum(b)+sum(a)*b[0]-a[0]*b[0]-c[2] c[0] = sum(a)*sum(b)-c[1]-c[2] c = [str(x%998244353) for x in c] print(' '.join(c))