B 卷积

找规律一题。
规律如图
图片说明

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <limits.h>
#include <sstream>
#include <cctype>
#include <numeric>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inlin")

using namespace std;

#define ios ios::sync_with_stdio(false) , cin.tie(0)
#define x first
#define y second

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;

const int N = 100010, INF = 0x3f3f3f3f, mod = 998244353, base = 131;
const double eps = 1e-6, PI = acos(-1);

int n;
LL a[N], b[N], c[N];

LL md(LL n)
{
  return (n + mod) % mod;
}
void work()
{
  cin >> n;
  for (int i = 0; i < n; i ++ ) scanf("%lld", &a[i]);
  for (int i = 0; i < n; i ++ ) scanf("%lld", &b[i]);

  LL suma = 0;
  for (int i = 1; i < n; i ++ )
  {
    suma = md(suma + a[i]);
  }
  // cout << suma << endl;
  LL sumb = 0;
  for (int j = 1; j < n; j ++ )
  {
    sumb = md(sumb + b[j] * suma);
  }

  // cout << sumb << endl;
  c[0] = sumb;
  // cout << c[0] << endl;
  suma = md(a[0] * b[0]);
  for (int i = 2; i < n; i ++ )
    suma = md(suma + a[0] * b[i]);
  for (int j = 2; j < n; j ++ )
    suma = md(suma + b[0] * a[j]);
  c[1] = suma;

  c[2] = md(md(a[1] * b[0]) + md(a[0] * b[1]));

  for (int i = 0; i < n; i ++ ) cout << c[i] << ' ';
  cout << endl;
}

int main()
{
  //ios;
  int T = 1;
  // cin >> T;
  while (T -- )
  {
    work();
  }

  return 0;
}