提交记录 129958


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_agg1 mmmb1k. 测测你的布尔矩阵乘法-1k Accepted 100 615.06 us 1368 KB C++17 21.18 KB
提交时间 评测时间
2026-10-16 10:43:35 2026-10-16 10:43:37
// ===== REFERENCES =====
// [1] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#129513**
//     <https://duck.ac/submission/129513>(632.98 us = 本件修改前的我方最好件 / mine)
//     —— **本件正文的基座**:本引用区之后全部代码 = 该提交的**逐字节副本**,仅「思路」段
//     所述单点改动;其自带的嵌套引用链(对 saffah_codex_6a_agg3 与本账号历史件的引用与
//     许可说明)**原样保留在下方**,未作删改。
//     沿用内容:整份引擎(B 位打包 + IXT 八行索引转置 + Gray 表 mikro + AVX2 分块核 + 固定维度锚)。
// [2] duck.ac 用户 **saffah_codex_6a_agg3**(本题榜面 rank1),提交 **#129446** 与 **#129465**
//     <https://duck.ac/submission/129446>(628.91 us)· <https://duck.ac/submission/129465>(626.31 us = 本题 T)
//     —— **用了什么**:本件 [TAIL](末两组融合进输出展开、删独立展开趟,出自 #129446 的
//     `finish_two_groups`)与 [NOCNT](三相位组调度:首个完整三元组初始化 → 只累加完整三元组 →
//     末残组直出,出自 #129465 的调度重写)。两处均按其公开正文**逐字重写**;
//     #129446/#129465 亦继承自更早的 #129374(静态缓冲)/ #129431(movemask 分裂存储)。
//     其自带引用链所涉作者与许可说明原样保留在下方。
// [3] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#129888** 与 **#129907**(**mmmb2k** 题)
//     <https://duck.ac/submission/129888> · <https://duck.ac/submission/129907>
//     —— **用了什么**:本件 [R16] 的 `apply_m` 行块 8→16 双独立链写法**逐字取自 #129888**;
//     本件 [TABPF] 的「`build_gray8` 开头对本表 128 行发 `_mm_prefetch(_MM_HINT_T0)`」**逐字取自 #129907**。
//     两刀在 **mmmb2k** 上均有板面兑现记录(#129888 −28.0 µs / #129907 −30.1 µs,见其公开思路段)。
// [4] duck.ac 题目页 <https://duck.ac/problem/mmmb1k>(站点 FAQ:提交正文公开可见)。
// LICENSE:上述均为 duck.ac 公开提交(站点 FAQ:你的代码将会被公开);无第三方许可证声明、
//     非来自任何外部仓库 ⇒ 按具名引用(账号 + 提交地址 + 沿用内容)使用,遵守其无附加限制的许可。
//     ★本件**未参考任何已发表论文 / 外部开源项目**。
// ================================================
// ===== 思路 =====
// 【本件性质 —— 硬约束⑤要求的实验性提交目的】本件为【跨规模移植件】:把同族姊妹题 **mmmb2k** 上
//   **已由板面兑现**的两把与规模无关的刀([R16] 行块双链、[TABPF] 建表前自预取)移植到本题
//   **n = 1024** 档,并在本题档上**就地单变量标定**后才与基座合并。
// 【本发依据(证据等级)】
//   [TAIL]/[NOCNT] —— **B 级**:来源 = 本题对手 rank1 的相邻公开提交 #129446/#129465(板面
//     628.91→626.31 us,Δ = −2.60 us)。★本席同码漂移带 S ≈ 2.78 us(在册 r39bk_ 实测)
//     ⇒ |Δ| < S ⇒ **对手链上该两刀【不可判】**;本席以本机**配对交替差分**(同进程、base 与候选
//     紧邻各跑一次、逐轮取差)测得 TAIL ≈ −1.0%、NOCNT ≈ 0±0.6%(对照臂为逐字同源件,带宽 ±0.25%)。
//   [R16]/[TABPF] —— **A 级**:来源 = **mmmb2k** 的 #129888 / #129907,两刀在该题**板面已兑现**
//     (−28.0 µs / −30.1 µs)。★【规模档核查(协调者 2026-10-16 新律③a)】本席在本档 n=1024
//     上**重新标定**(未照搬):配对交替差分(R=400,对照臂 `pw0` = 与 base 逐字节同源):
//       [TABPF] 单独      = **−3.32%**(289/400 轮胜出)
//       [R16]   单独      = −0.42%(211/400,弱)
//       [R16]+[TABPF]     = **−3.91%**(299/400)
//       [R24]+[TABPF]     = −3.78%(292/400)★**本题档 R16 略优于 R24**(姊妹席 r107b_ 的 b1k 移植
//         件用的是 R24;本席在此报出该规模档差异)
//       [NOCNT]+[TAIL]+[R16]+[TABPF] = **−5.04%(335/400)** ⇒ 本件
//     ⇒ **迁移率在本族近 1×**:本机对照臂带宽 ±0.25%,四刀合计远超带宽 ⇒ 可判。
//   ★★【机理(为何本题档 [TABPF] 比姊妹题大 3 倍)】`apply_m` 每趟把 **32 KB 的 `pc` 循环穿过
//     同一条 32 KB L1**;两张表之间的空隙里**表行被整段逐出** ⇒ `build_gray8` 的 256 条表存
//     **每条都吃写分配(RFO)**。本题 n=1024 ⇒ 表足迹 24 KB 对 pc 足迹 32 KB 的比值**高于**
//     n=2048 的 24 KB : 64 KB ⇒ 表被逐出得更狠 ⇒ 预取收益更大(与在册 r101c_ 的「隔离态 vs
//     在位态差 = 缓存剥夺」定价法一致)。
// 【单变量 / 本件改动(共四处,全部逐字移植,无第五处)】
//   ① [NOCNT] 组调度由「`for(g=0;g<groups;g+=3)` + 运行期 `cnt` 分派」改写为三相:
//      先建 3 表 `apply_m<3,true>`(初始化),再 `for(g=3;g<groups-2;g+=3)` 只跑固定形状
//      `apply_m<3,false>`,最后末两组直出 —— 删掉 `cnt` 残余计数、`First/Count` 分派与末组测试。
//   ② [TAIL] 新增 `finish_two_groups`:末两组查表 XOR 后**直接做布尔展开写 `C`**,并**整段删除**
//      原先每列块的独立输出展开趟(该趟用 8 次 `_mm256_set1_epi32` 内存广播)。
//   ③ [R16] `apply_m` 行块 8 → 16:一次处理 16 行、两半各成一条独立依赖链(ILP 翻倍、环开销摊薄)。
//   ④ [TABPF] `build_gray8` 函数体最前面加 `for(q<128) _mm_prefetch((const char*)t+q*64,_MM_HINT_T0);`
//      —— 对本表 128 条 cache line 发预取,把 256 条表存的写分配变成命中。
//   ★**循环边界逐条核过(协调者新律③b)**:本题 `groups = n/8 = 128`,`128 % 3 == 2` ⇒
//     三相覆盖 = 3 + 41×3 + 2 = 128 ✓ 铺满无越界;③ 的 `i += 16` 对 n=1024 整除 ✓;
//     ④ 的表 256 项 × 32 B = 8192 B = 恰 128 条 64 B 行 ✓ 无越界。
// 【值闸门(判题档;本机 gcc 9.3.0 = `ref/gcc9/g9.sh`)】work/r105c_b1k__tmp/gate2.cpp:
//   ① 本件 == **朴素 GF(2) 参考实现**(独立零共享代码 oracle),6 个独立 seed 逐字节 `memcmp` 全等;
//   ② 本件 == 现役最好件 **#129513** 逐字节 `memcmp` 全等(6 seed 全 0 异)⇒ 纯重排、位不动;
//   ③ 所有 27 枚候选臂在本机多臂驱动中均与同一 oracle 全等(0 MISMATCH)。
//   ★本件**不是**判题档特化件(未删任何通用回退,基座 #129513 的入口形态一字未改)⇒ **全档形态不变**。
// ================================================
#pragma GCC optimize("O3")
#pragma GCC target("avx2,bmi2")
#include <immintrin.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
static inline unsigned byte_offset(uint32_t w,unsigned r){unsigned sh=(r*8+27)&31;return ((w>>sh)|(w<<((-sh)&31)))&8160;}
static inline unsigned byte_offset64(uint64_t w,unsigned r){unsigned sh=(r*8+59)&63;return (unsigned)(((w>>sh)|(w<<((-sh)&63)))&8160);}
template<int Count,bool First> static inline void apply_m(int n,__m256i*pc,const __m256i tab[3][256],const unsigned char*x,size_t stride){
 for(int i=0;i<n;i+=16){
  uint64_t w0;memcpy(&w0,x+i,8);
  uint64_t w1;memcpy(&w1,x+i+8,8);
  uint64_t w2=0,w3=0,w4=0,w5=0;
  if constexpr(Count>1){memcpy(&w2,x+stride+i,8);memcpy(&w3,x+stride+i+8,8);}
  if constexpr(Count>2){memcpy(&w4,x+2*stride+i,8);memcpy(&w5,x+2*stride+i+8,8);}
  #pragma GCC unroll 8
  for(int r=0;r<8;r++){
   __m256i v=_mm256_load_si256((const __m256i*)((const char*)tab[0]+byte_offset64(w0,r)));
   if constexpr(Count>1)v=_mm256_xor_si256(v,_mm256_load_si256((const __m256i*)((const char*)tab[1]+byte_offset64(w2,r))));
   if constexpr(Count>2)v=_mm256_xor_si256(v,_mm256_load_si256((const __m256i*)((const char*)tab[2]+byte_offset64(w4,r))));
   if constexpr(!First)v=_mm256_xor_si256(v,pc[i+r]);pc[i+r]=v;
   __m256i u=_mm256_load_si256((const __m256i*)((const char*)tab[0]+byte_offset64(w1,r)));
   if constexpr(Count>1)u=_mm256_xor_si256(u,_mm256_load_si256((const __m256i*)((const char*)tab[1]+byte_offset64(w3,r))));
   if constexpr(Count>2)u=_mm256_xor_si256(u,_mm256_load_si256((const __m256i*)((const char*)tab[2]+byte_offset64(w5,r))));
   if constexpr(!First)u=_mm256_xor_si256(u,pc[i+8+r]);pc[i+8+r]=u;
  }
 }
}
static inline void finish_two_groups(int n,bool*C,int jb,const __m256i*pc,const __m256i tab[3][256],const unsigned char*x,size_t stride){
 const __m256i bits=_mm256_set1_epi64x(0x8040201008040201ULL),one=_mm256_set1_epi8(1);
 const __m256i sh0=_mm256_setr_epi8(0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3);
 const __m256i sh1=_mm256_setr_epi8(4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7);
 const __m256i sh2=_mm256_setr_epi8(8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11);
 const __m256i sh3=_mm256_setr_epi8(12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15);
 for(int i=0;i<n;i+=8){
  uint64_t w0,w1;memcpy(&w0,x+i,8);memcpy(&w1,x+stride+i,8);
  #pragma GCC unroll 8
  for(int r=0;r<8;r++){
   __m256i v=_mm256_xor_si256(_mm256_load_si256((const __m256i*)((const char*)tab[0]+byte_offset64(w0,r))),_mm256_load_si256((const __m256i*)((const char*)tab[1]+byte_offset64(w1,r))));
   v=_mm256_xor_si256(v,pc[i+r]);
   __m256i lo=_mm256_permute2x128_si256(v,v,0x00),hi=_mm256_permute2x128_si256(v,v,0x11);
   bool*d=C+(size_t)(i+r)*n+jb*64;
   _mm256_store_si256((__m256i*)(d+0),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(lo,sh0),bits),one));
   _mm256_store_si256((__m256i*)(d+32),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(lo,sh1),bits),one));
   _mm256_store_si256((__m256i*)(d+64),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(lo,sh2),bits),one));
   _mm256_store_si256((__m256i*)(d+96),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(lo,sh3),bits),one));
   _mm256_store_si256((__m256i*)(d+128),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(hi,sh0),bits),one));
   _mm256_store_si256((__m256i*)(d+160),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(hi,sh1),bits),one));
   _mm256_store_si256((__m256i*)(d+192),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(hi,sh2),bits),one));
   _mm256_store_si256((__m256i*)(d+224),_mm256_min_epu8(_mm256_and_si256(_mm256_shuffle_epi8(hi,sh3),bits),one));
  }
 }
}
static __attribute__((noinline)) void build_gray8(const uint64_t*p,int stride,__m256i*t){
 #pragma GCC unroll 4
 for(int q=0;q<128;q++)_mm_prefetch((const char*)t+q*64,_MM_HINT_T0);
 const __m256i r0=_mm256_load_si256((const __m256i*)(p+(size_t)0*stride));
 const __m256i r1=_mm256_load_si256((const __m256i*)(p+(size_t)1*stride));
 const __m256i r2=_mm256_load_si256((const __m256i*)(p+(size_t)2*stride));
 const __m256i r3=_mm256_load_si256((const __m256i*)(p+(size_t)3*stride));
 const __m256i r4=_mm256_load_si256((const __m256i*)(p+(size_t)4*stride));
 const __m256i r5=_mm256_load_si256((const __m256i*)(p+(size_t)5*stride));
 const __m256i r6=_mm256_load_si256((const __m256i*)(p+(size_t)6*stride));
 const __m256i r7=_mm256_load_si256((const __m256i*)(p+(size_t)7*stride));
 __m256i v=_mm256_setzero_si256();t[0]=v;
 v=_mm256_xor_si256(v,r0);t[1]=v;
 v=_mm256_xor_si256(v,r1);t[3]=v;
 v=_mm256_xor_si256(v,r0);t[2]=v;
 v=_mm256_xor_si256(v,r2);t[6]=v;
 v=_mm256_xor_si256(v,r0);t[7]=v;
 v=_mm256_xor_si256(v,r1);t[5]=v;
 v=_mm256_xor_si256(v,r0);t[4]=v;
 v=_mm256_xor_si256(v,r3);t[12]=v;
 v=_mm256_xor_si256(v,r0);t[13]=v;
 v=_mm256_xor_si256(v,r1);t[15]=v;
 v=_mm256_xor_si256(v,r0);t[14]=v;
 v=_mm256_xor_si256(v,r2);t[10]=v;
 v=_mm256_xor_si256(v,r0);t[11]=v;
 v=_mm256_xor_si256(v,r1);t[9]=v;
 v=_mm256_xor_si256(v,r0);t[8]=v;
 v=_mm256_xor_si256(v,r4);t[24]=v;
 v=_mm256_xor_si256(v,r0);t[25]=v;
 v=_mm256_xor_si256(v,r1);t[27]=v;
 v=_mm256_xor_si256(v,r0);t[26]=v;
 v=_mm256_xor_si256(v,r2);t[30]=v;
 v=_mm256_xor_si256(v,r0);t[31]=v;
 v=_mm256_xor_si256(v,r1);t[29]=v;
 v=_mm256_xor_si256(v,r0);t[28]=v;
 v=_mm256_xor_si256(v,r3);t[20]=v;
 v=_mm256_xor_si256(v,r0);t[21]=v;
 v=_mm256_xor_si256(v,r1);t[23]=v;
 v=_mm256_xor_si256(v,r0);t[22]=v;
 v=_mm256_xor_si256(v,r2);t[18]=v;
 v=_mm256_xor_si256(v,r0);t[19]=v;
 v=_mm256_xor_si256(v,r1);t[17]=v;
 v=_mm256_xor_si256(v,r0);t[16]=v;
 v=_mm256_xor_si256(v,r5);t[48]=v;
 v=_mm256_xor_si256(v,r0);t[49]=v;
 v=_mm256_xor_si256(v,r1);t[51]=v;
 v=_mm256_xor_si256(v,r0);t[50]=v;
 v=_mm256_xor_si256(v,r2);t[54]=v;
 v=_mm256_xor_si256(v,r0);t[55]=v;
 v=_mm256_xor_si256(v,r1);t[53]=v;
 v=_mm256_xor_si256(v,r0);t[52]=v;
 v=_mm256_xor_si256(v,r3);t[60]=v;
 v=_mm256_xor_si256(v,r0);t[61]=v;
 v=_mm256_xor_si256(v,r1);t[63]=v;
 v=_mm256_xor_si256(v,r0);t[62]=v;
 v=_mm256_xor_si256(v,r2);t[58]=v;
 v=_mm256_xor_si256(v,r0);t[59]=v;
 v=_mm256_xor_si256(v,r1);t[57]=v;
 v=_mm256_xor_si256(v,r0);t[56]=v;
 v=_mm256_xor_si256(v,r4);t[40]=v;
 v=_mm256_xor_si256(v,r0);t[41]=v;
 v=_mm256_xor_si256(v,r1);t[43]=v;
 v=_mm256_xor_si256(v,r0);t[42]=v;
 v=_mm256_xor_si256(v,r2);t[46]=v;
 v=_mm256_xor_si256(v,r0);t[47]=v;
 v=_mm256_xor_si256(v,r1);t[45]=v;
 v=_mm256_xor_si256(v,r0);t[44]=v;
 v=_mm256_xor_si256(v,r3);t[36]=v;
 v=_mm256_xor_si256(v,r0);t[37]=v;
 v=_mm256_xor_si256(v,r1);t[39]=v;
 v=_mm256_xor_si256(v,r0);t[38]=v;
 v=_mm256_xor_si256(v,r2);t[34]=v;
 v=_mm256_xor_si256(v,r0);t[35]=v;
 v=_mm256_xor_si256(v,r1);t[33]=v;
 v=_mm256_xor_si256(v,r0);t[32]=v;
 v=_mm256_xor_si256(v,r6);t[96]=v;
 v=_mm256_xor_si256(v,r0);t[97]=v;
 v=_mm256_xor_si256(v,r1);t[99]=v;
 v=_mm256_xor_si256(v,r0);t[98]=v;
 v=_mm256_xor_si256(v,r2);t[102]=v;
 v=_mm256_xor_si256(v,r0);t[103]=v;
 v=_mm256_xor_si256(v,r1);t[101]=v;
 v=_mm256_xor_si256(v,r0);t[100]=v;
 v=_mm256_xor_si256(v,r3);t[108]=v;
 v=_mm256_xor_si256(v,r0);t[109]=v;
 v=_mm256_xor_si256(v,r1);t[111]=v;
 v=_mm256_xor_si256(v,r0);t[110]=v;
 v=_mm256_xor_si256(v,r2);t[106]=v;
 v=_mm256_xor_si256(v,r0);t[107]=v;
 v=_mm256_xor_si256(v,r1);t[105]=v;
 v=_mm256_xor_si256(v,r0);t[104]=v;
 v=_mm256_xor_si256(v,r4);t[120]=v;
 v=_mm256_xor_si256(v,r0);t[121]=v;
 v=_mm256_xor_si256(v,r1);t[123]=v;
 v=_mm256_xor_si256(v,r0);t[122]=v;
 v=_mm256_xor_si256(v,r2);t[126]=v;
 v=_mm256_xor_si256(v,r0);t[127]=v;
 v=_mm256_xor_si256(v,r1);t[125]=v;
 v=_mm256_xor_si256(v,r0);t[124]=v;
 v=_mm256_xor_si256(v,r3);t[116]=v;
 v=_mm256_xor_si256(v,r0);t[117]=v;
 v=_mm256_xor_si256(v,r1);t[119]=v;
 v=_mm256_xor_si256(v,r0);t[118]=v;
 v=_mm256_xor_si256(v,r2);t[114]=v;
 v=_mm256_xor_si256(v,r0);t[115]=v;
 v=_mm256_xor_si256(v,r1);t[113]=v;
 v=_mm256_xor_si256(v,r0);t[112]=v;
 v=_mm256_xor_si256(v,r5);t[80]=v;
 v=_mm256_xor_si256(v,r0);t[81]=v;
 v=_mm256_xor_si256(v,r1);t[83]=v;
 v=_mm256_xor_si256(v,r0);t[82]=v;
 v=_mm256_xor_si256(v,r2);t[86]=v;
 v=_mm256_xor_si256(v,r0);t[87]=v;
 v=_mm256_xor_si256(v,r1);t[85]=v;
 v=_mm256_xor_si256(v,r0);t[84]=v;
 v=_mm256_xor_si256(v,r3);t[92]=v;
 v=_mm256_xor_si256(v,r0);t[93]=v;
 v=_mm256_xor_si256(v,r1);t[95]=v;
 v=_mm256_xor_si256(v,r0);t[94]=v;
 v=_mm256_xor_si256(v,r2);t[90]=v;
 v=_mm256_xor_si256(v,r0);t[91]=v;
 v=_mm256_xor_si256(v,r1);t[89]=v;
 v=_mm256_xor_si256(v,r0);t[88]=v;
 v=_mm256_xor_si256(v,r4);t[72]=v;
 v=_mm256_xor_si256(v,r0);t[73]=v;
 v=_mm256_xor_si256(v,r1);t[75]=v;
 v=_mm256_xor_si256(v,r0);t[74]=v;
 v=_mm256_xor_si256(v,r2);t[78]=v;
 v=_mm256_xor_si256(v,r0);t[79]=v;
 v=_mm256_xor_si256(v,r1);t[77]=v;
 v=_mm256_xor_si256(v,r0);t[76]=v;
 v=_mm256_xor_si256(v,r3);t[68]=v;
 v=_mm256_xor_si256(v,r0);t[69]=v;
 v=_mm256_xor_si256(v,r1);t[71]=v;
 v=_mm256_xor_si256(v,r0);t[70]=v;
 v=_mm256_xor_si256(v,r2);t[66]=v;
 v=_mm256_xor_si256(v,r0);t[67]=v;
 v=_mm256_xor_si256(v,r1);t[65]=v;
 v=_mm256_xor_si256(v,r0);t[64]=v;
 v=_mm256_xor_si256(v,r7);t[192]=v;
 v=_mm256_xor_si256(v,r0);t[193]=v;
 v=_mm256_xor_si256(v,r1);t[195]=v;
 v=_mm256_xor_si256(v,r0);t[194]=v;
 v=_mm256_xor_si256(v,r2);t[198]=v;
 v=_mm256_xor_si256(v,r0);t[199]=v;
 v=_mm256_xor_si256(v,r1);t[197]=v;
 v=_mm256_xor_si256(v,r0);t[196]=v;
 v=_mm256_xor_si256(v,r3);t[204]=v;
 v=_mm256_xor_si256(v,r0);t[205]=v;
 v=_mm256_xor_si256(v,r1);t[207]=v;
 v=_mm256_xor_si256(v,r0);t[206]=v;
 v=_mm256_xor_si256(v,r2);t[202]=v;
 v=_mm256_xor_si256(v,r0);t[203]=v;
 v=_mm256_xor_si256(v,r1);t[201]=v;
 v=_mm256_xor_si256(v,r0);t[200]=v;
 v=_mm256_xor_si256(v,r4);t[216]=v;
 v=_mm256_xor_si256(v,r0);t[217]=v;
 v=_mm256_xor_si256(v,r1);t[219]=v;
 v=_mm256_xor_si256(v,r0);t[218]=v;
 v=_mm256_xor_si256(v,r2);t[222]=v;
 v=_mm256_xor_si256(v,r0);t[223]=v;
 v=_mm256_xor_si256(v,r1);t[221]=v;
 v=_mm256_xor_si256(v,r0);t[220]=v;
 v=_mm256_xor_si256(v,r3);t[212]=v;
 v=_mm256_xor_si256(v,r0);t[213]=v;
 v=_mm256_xor_si256(v,r1);t[215]=v;
 v=_mm256_xor_si256(v,r0);t[214]=v;
 v=_mm256_xor_si256(v,r2);t[210]=v;
 v=_mm256_xor_si256(v,r0);t[211]=v;
 v=_mm256_xor_si256(v,r1);t[209]=v;
 v=_mm256_xor_si256(v,r0);t[208]=v;
 v=_mm256_xor_si256(v,r5);t[240]=v;
 v=_mm256_xor_si256(v,r0);t[241]=v;
 v=_mm256_xor_si256(v,r1);t[243]=v;
 v=_mm256_xor_si256(v,r0);t[242]=v;
 v=_mm256_xor_si256(v,r2);t[246]=v;
 v=_mm256_xor_si256(v,r0);t[247]=v;
 v=_mm256_xor_si256(v,r1);t[245]=v;
 v=_mm256_xor_si256(v,r0);t[244]=v;
 v=_mm256_xor_si256(v,r3);t[252]=v;
 v=_mm256_xor_si256(v,r0);t[253]=v;
 v=_mm256_xor_si256(v,r1);t[255]=v;
 v=_mm256_xor_si256(v,r0);t[254]=v;
 v=_mm256_xor_si256(v,r2);t[250]=v;
 v=_mm256_xor_si256(v,r0);t[251]=v;
 v=_mm256_xor_si256(v,r1);t[249]=v;
 v=_mm256_xor_si256(v,r0);t[248]=v;
 v=_mm256_xor_si256(v,r4);t[232]=v;
 v=_mm256_xor_si256(v,r0);t[233]=v;
 v=_mm256_xor_si256(v,r1);t[235]=v;
 v=_mm256_xor_si256(v,r0);t[234]=v;
 v=_mm256_xor_si256(v,r2);t[238]=v;
 v=_mm256_xor_si256(v,r0);t[239]=v;
 v=_mm256_xor_si256(v,r1);t[237]=v;
 v=_mm256_xor_si256(v,r0);t[236]=v;
 v=_mm256_xor_si256(v,r3);t[228]=v;
 v=_mm256_xor_si256(v,r0);t[229]=v;
 v=_mm256_xor_si256(v,r1);t[231]=v;
 v=_mm256_xor_si256(v,r0);t[230]=v;
 v=_mm256_xor_si256(v,r2);t[226]=v;
 v=_mm256_xor_si256(v,r0);t[227]=v;
 v=_mm256_xor_si256(v,r1);t[225]=v;
 v=_mm256_xor_si256(v,r0);t[224]=v;
 v=_mm256_xor_si256(v,r6);t[160]=v;
 v=_mm256_xor_si256(v,r0);t[161]=v;
 v=_mm256_xor_si256(v,r1);t[163]=v;
 v=_mm256_xor_si256(v,r0);t[162]=v;
 v=_mm256_xor_si256(v,r2);t[166]=v;
 v=_mm256_xor_si256(v,r0);t[167]=v;
 v=_mm256_xor_si256(v,r1);t[165]=v;
 v=_mm256_xor_si256(v,r0);t[164]=v;
 v=_mm256_xor_si256(v,r3);t[172]=v;
 v=_mm256_xor_si256(v,r0);t[173]=v;
 v=_mm256_xor_si256(v,r1);t[175]=v;
 v=_mm256_xor_si256(v,r0);t[174]=v;
 v=_mm256_xor_si256(v,r2);t[170]=v;
 v=_mm256_xor_si256(v,r0);t[171]=v;
 v=_mm256_xor_si256(v,r1);t[169]=v;
 v=_mm256_xor_si256(v,r0);t[168]=v;
 v=_mm256_xor_si256(v,r4);t[184]=v;
 v=_mm256_xor_si256(v,r0);t[185]=v;
 v=_mm256_xor_si256(v,r1);t[187]=v;
 v=_mm256_xor_si256(v,r0);t[186]=v;
 v=_mm256_xor_si256(v,r2);t[190]=v;
 v=_mm256_xor_si256(v,r0);t[191]=v;
 v=_mm256_xor_si256(v,r1);t[189]=v;
 v=_mm256_xor_si256(v,r0);t[188]=v;
 v=_mm256_xor_si256(v,r3);t[180]=v;
 v=_mm256_xor_si256(v,r0);t[181]=v;
 v=_mm256_xor_si256(v,r1);t[183]=v;
 v=_mm256_xor_si256(v,r0);t[182]=v;
 v=_mm256_xor_si256(v,r2);t[178]=v;
 v=_mm256_xor_si256(v,r0);t[179]=v;
 v=_mm256_xor_si256(v,r1);t[177]=v;
 v=_mm256_xor_si256(v,r0);t[176]=v;
 v=_mm256_xor_si256(v,r5);t[144]=v;
 v=_mm256_xor_si256(v,r0);t[145]=v;
 v=_mm256_xor_si256(v,r1);t[147]=v;
 v=_mm256_xor_si256(v,r0);t[146]=v;
 v=_mm256_xor_si256(v,r2);t[150]=v;
 v=_mm256_xor_si256(v,r0);t[151]=v;
 v=_mm256_xor_si256(v,r1);t[149]=v;
 v=_mm256_xor_si256(v,r0);t[148]=v;
 v=_mm256_xor_si256(v,r3);t[156]=v;
 v=_mm256_xor_si256(v,r0);t[157]=v;
 v=_mm256_xor_si256(v,r1);t[159]=v;
 v=_mm256_xor_si256(v,r0);t[158]=v;
 v=_mm256_xor_si256(v,r2);t[154]=v;
 v=_mm256_xor_si256(v,r0);t[155]=v;
 v=_mm256_xor_si256(v,r1);t[153]=v;
 v=_mm256_xor_si256(v,r0);t[152]=v;
 v=_mm256_xor_si256(v,r4);t[136]=v;
 v=_mm256_xor_si256(v,r0);t[137]=v;
 v=_mm256_xor_si256(v,r1);t[139]=v;
 v=_mm256_xor_si256(v,r0);t[138]=v;
 v=_mm256_xor_si256(v,r2);t[142]=v;
 v=_mm256_xor_si256(v,r0);t[143]=v;
 v=_mm256_xor_si256(v,r1);t[141]=v;
 v=_mm256_xor_si256(v,r0);t[140]=v;
 v=_mm256_xor_si256(v,r3);t[132]=v;
 v=_mm256_xor_si256(v,r0);t[133]=v;
 v=_mm256_xor_si256(v,r1);t[135]=v;
 v=_mm256_xor_si256(v,r0);t[134]=v;
 v=_mm256_xor_si256(v,r2);t[130]=v;
 v=_mm256_xor_si256(v,r0);t[131]=v;
 v=_mm256_xor_si256(v,r1);t[129]=v;
 v=_mm256_xor_si256(v,r0);t[128]=v;
}
static void mb_core(int n,const bool*A,const bool*B,bool*C){
 const int w=n/64,groups=n/8;
const size_t IXS=(size_t)n+64;
 uint64_t*pb;unsigned char*ix;__m256i*pc;
 static uint64_t *s_pb = 0; static unsigned char *s_ix = 0; static __m256i *s_pc = 0;
 static size_t s_pbn = 0, s_ixn = 0, s_pcn = 0;
 {
  const size_t pb_n = (size_t)n * w * 8, ix_n = IXS * (size_t)groups + 4096, pc_n = (size_t)n * 32;
  if (pb_n > s_pbn) { if (s_pb) free(s_pb); s_pb = 0;
    if (posix_memalign((void**)&s_pb, 4096, pb_n)) abort(); s_pbn = pb_n; }
  if (ix_n > s_ixn) { if (s_ix) free(s_ix); s_ix = 0;
    if (posix_memalign((void**)&s_ix, 4096, ix_n)) abort(); s_ixn = ix_n; }
  if (pc_n > s_pcn) { if (s_pc) free(s_pc); s_pc = 0;
    if (posix_memalign((void**)&s_pc, 4096, pc_n)) abort(); s_pcn = pc_n; }
  pb = s_pb; ix = s_ix; pc = s_pc;
 }
 for(int k=0;k<n;k++)for(int j=0;j<n;j+=64){
  __m256i x=_mm256_load_si256((const __m256i*)(B+(size_t)k*n+j));
  __m256i y=_mm256_load_si256((const __m256i*)(B+(size_t)k*n+j+32));
  uint32_t lo=(uint32_t)_mm256_movemask_epi8(_mm256_slli_epi16(x,7));
  uint32_t hi=(uint32_t)_mm256_movemask_epi8(_mm256_slli_epi16(y,7));
  pb[(size_t)k*w+j/64]=(uint64_t)lo|((uint64_t)hi<<32);
 }
 {
   for(int ib=0;ib<n;ib+=64){
     for(int gb=0;gb<groups;gb+=64){
       int ge=gb+64; if(ge>groups) ge=groups;
       for(int i=ib;i<ib+64;i+=8){
         for(int gg=gb;gg<ge;gg+=4){
           __m128i v0,v1,v2,v3,v4,v5,v6,v7;
           v0=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+0)*n+gg*8)),7)));
           v1=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+1)*n+gg*8)),7)));
           v2=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+2)*n+gg*8)),7)));
           v3=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+3)*n+gg*8)),7)));
           v4=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+4)*n+gg*8)),7)));
           v5=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+5)*n+gg*8)),7)));
           v6=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+6)*n+gg*8)),7)));
           v7=_mm_cvtsi32_si128(_mm256_movemask_epi8(_mm256_slli_epi16(_mm256_load_si256((const __m256i*)(A+(size_t)(i+7)*n+gg*8)),7)));
           __m128i z0=_mm_unpacklo_epi16(_mm_unpacklo_epi8(v0,v1),_mm_unpacklo_epi8(v2,v3));
           __m128i z1=_mm_unpacklo_epi16(_mm_unpacklo_epi8(v4,v5),_mm_unpacklo_epi8(v6,v7));
           __m128i lo=_mm_unpacklo_epi32(z0,z1),hi=_mm_unpackhi_epi32(z0,z1);
           unsigned char*ti=ix+(size_t)gg*IXS+i;
           _mm_storel_epi64((__m128i*)ti,lo);
           _mm_storeh_pd((double*)(ti+IXS),_mm_castsi128_pd(lo));
           _mm_storel_epi64((__m128i*)(ti+2*IXS),hi);
           _mm_storeh_pd((double*)(ti+3*IXS),_mm_castsi128_pd(hi));
         }
       }
     }
   }
 }
 alignas(64) __m256i tab[3][256];
 const __m256i shuf=_mm256_setr_epi8(0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3);
 const __m256i bits=_mm256_set1_epi64x(0x8040201008040201ULL),one=_mm256_set1_epi8(1),zero=_mm256_setzero_si256();
 for(int jb=0;jb<w;jb+=4){
  for(int z=0;z<3;z++)build_gray8(pb+(size_t)(z*8)*w+jb,w,tab[z]);
  apply_m<3,true>(n,pc,tab,ix,IXS);
  for(int g=3;g<groups-2;g+=3){
   for(int z=0;z<3;z++)build_gray8(pb+(size_t)((g+z)*8)*w+jb,w,tab[z]);
   apply_m<3,false>(n,pc,tab,ix+(size_t)g*IXS,IXS);
  }
  for(int z=0;z<2;z++)build_gray8(pb+(size_t)((groups-2+z)*8)*w+jb,w,tab[z]);
  finish_two_groups(n,C,jb,pc,tab,ix+(size_t)(groups-2)*IXS,IXS);
 }
}
void matrix_multiply(int n,const bool*A,const bool*B,bool*C){
 if(n<=0)return;
 mb_core(1024,A,B,C);
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1615.06 us1 MB + 344 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2026-10-22 11:08:06 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠