列表

详情


NC218216. 卷积

描述

给定两个长度为­ 的数列  ,定义序列  满足

其中  表示自然数集合 S 中未出现的最小的自然数。

请你求出序列 的值,对 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))

上一题