提交记录 21366


用户 题目 状态 得分 用时 内存 语言 代码长度
qwqautomaton 1000. 测测你的 A+B Compile Error 0 0 ns 0 KB C++17 2.53 KB
提交时间 评测时间
2024-03-08 22:47:31 2024-03-08 22:47:34
#include<bits/stdc++.h>
#include <immintrin.h>
#include <emmintrin.h>
#define U unsigned
#define INF 0x3f3f3f3f
#define endl '\n'
#define IOS ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;

struct ymm
{
	__m256i x;
	ymm(__m256i x) :x(x) {}
	ymm(const void* p) :x(*(__m256i*)p) {}
	ymm(U x) :x(_mm256_set1_epi32(x)) {}
	operator __m256i() { return x; }
	void store(void* p) const { *(__m256i*)p = x; }
};
inline ymm operator+(ymm a, ymm b) { return _mm256_add_epi32(a, b); }
inline ymm operator-(ymm a, ymm b) { return _mm256_sub_epi32(a, b); }
inline ymm operator*(ymm a, ymm b) { return _mm256_mul_epu32(a, b); }
inline ymm operator|(ymm a, ymm b) { return _mm256_or_si256(a, b); }
inline ymm operator&(ymm a, ymm b) { return _mm256_and_si256(a, b); }
inline ymm operator>(ymm a, ymm b) { return _mm256_cmpgt_epi32(a, b); }
inline ymm operator==(ymm a, ymm b) { return _mm256_cmpeq_epi32(a, b); }
inline ymm operator>>(ymm a, int w) { return _mm256_srli_epi32(a, w); }
inline ymm operator<<(ymm a, int w) { return _mm256_slli_epi32(a, w); }
template<U mask>
inline ymm blend(ymm a, ymm b) { return _mm256_blend_epi32(a, b, mask); }
inline ymm blendv(ymm a, ymm b, ymm mask) { return _mm256_blendv_epi8(a, b, mask); }
template<U mask>
inline ymm permute2x128(ymm a, ymm b) {
	return
		_mm256_permute2x128_si256(a, b, mask);
}
inline ymm rmov(ymm a, int w) { return _mm256_srli_epi64(a, w); }
inline ymm lmov(ymm a, int w) { return _mm256_slli_epi64(a, w); }
template<int w>
inline ymm rmov128(ymm a) { return _mm256_bsrli_epi128(a, w); }
template<int w>
inline ymm lmov128(ymm a) { return _mm256_bslli_epi128(a, w); }
inline ymm mullo(ymm a, ymm b) { return _mm256_mullo_epi32(a, b); }
inline ymm mul_mod(ymm a, ymm b)
{
	static constexpr U mask = 0xaa;
	ymm t1 = a * b, t2 = rmov(a, 32) * rmov(b, 32);
	ymm abl = blend<mask>(t1, lmov(t2, 32));
	ymm abh = blend<mask>(rmov(t1, 21), lmov(t2, 11));
	//ymm ab_p = blend<mask>(rmov(abh * mod_inv_vec, 32), rmov(abh, 32) * mod_inv_vec);//mod_inv_vec Ϊp·ÖÖ®Ò»
	//a = abl - mullo(ab_p, mod_vec);//mod_vec Ϊp
	//return a - (a > mod_vec & mod_vec);
	ymm ab_p = blend<mask>(rmov(abh * 0.1, 32), rmov(abh, 32) * 0.1);//mod_inv_vec Ϊp·ÖÖ®Ò»
	a = abl - mullo(ab_p, 10);//mod_vec Ϊp
	return a - (a > 10 & 10);
}

int main()
{
	IOS;
	U a, b;
	alignas(32)int c[8],d[8];
	cin >> a >> b;
	ymm A(a); ymm B(b);
	ymm ans1(operator+(A, B));
	ymm ans2(mul_mod(A, B));
	ans1.store(c);
	ans2.store(d);
	cout << *c << " " << *d << endl;
	return 0;
}

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2024-04-28 07:47:51 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用