結果
問題 | No.8046 yukicoderの過去問 |
ユーザー |
![]() |
提出日時 | 2022-08-14 12:17:13 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 421 ms / 2,000 ms |
コード長 | 1,188 bytes |
コンパイル時間 | 3,213 ms |
コンパイル使用メモリ | 273,552 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-01 05:29:48 |
合計ジャッジ時間 | 7,566 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 9 |
ソースコード
#pragma GCC target("avx2")#pragma GCC optimize("O3,unroll-loops")#include <bits/stdc++.h>#include <immintrin.h>#define N 100016#define MOD 1000000007int ri() {int n;scanf("%d", &n);return n;}using vec_t = __m256i;__attribute__((aligned(32))) uint64_t table[N], dp[N];void calc0() {dp[0] = 1;# define BLOCK 8for (int i = 0; i < N; i += BLOCK) {for (int j = i; j < i + BLOCK; j++) {dp[j] %= MOD;for (int k = j + 1; k < i + BLOCK; k++) dp[k] += dp[j] & table[k - j];}# define DEF_A(x) vec_t a##x = _mm256_set1_epi64x(dp[i + x])DEF_A(0); DEF_A(1); DEF_A(2); DEF_A(3);DEF_A(4); DEF_A(5); DEF_A(6); DEF_A(7);int j = 0;for (; j < N - i - 8 - 8; j += 4) {vec_t added = _mm256_load_si256((vec_t *) (dp + i + BLOCK + j));# define ADD(x) added = _mm256_add_epi64(added, _mm256_and_si256(a##x, _mm256_loadu_si256((vec_t *) (table + j + (8 - x)))))ADD(7); ADD(6); ADD(5); ADD(4);ADD(3); ADD(2); ADD(1); ADD(0);_mm256_storeu_si256((vec_t *) (dp + i + BLOCK + j), added);}}}int main() {int k = ri();int n = ri();for (int i = 0; i < n; i++) table[ri()] = -1;calc0();printf("%d\n", (int) dp[k]);return 0;}