2025牛客多校第八场 根号-2进制 个人题解

J.根号-2进制

#数学 #FFT
image

思路

赛后发现身边的同学都是通过借位来解决进位问题的,在此提供一种全程不出现减法的顺推做法

首先A,BA,BA,B可以理解为两个多项式:A0+A1−2+A2(−2)2+…A_{0}+A_{1}\sqrt{ -2 }+A_{2}(\sqrt{ -2 })^2+\dotsA0+A12+A2(2)2+,其中Ai={0,1}A_{i}=\{ 0,1 \}Ai={0,1}BiB_{i}Bi同理

那么可以使用多项式乘法FFTFFTFFT先将A,BA,BA,B相乘后的结果表示为一个新的多项式CCC,此时该多项式的系数CiC_{i}Ci不一定为{0,1}\{ 0,1 \}{0,1}

因此我们的任务变为了如何将一个多项式的系数在−2\sqrt{ -2 }2进制下全部化为{0,1}\{ 0,1 \}{0,1}

为了方便观察,将−2\sqrt{ -2 }2写为212i2^{\frac{1}{2}}i221i,则(−2)k=2k2ik(\sqrt{ -2 })^k=2^{\frac{k}{2}}i^k(2)k=22kik

打表观察:
i=1:212ii=2:−222i=3:−232ii=4:242i=5:252ii=6:−262\begin{align} &i=1:\quad 2^{\frac{1}{2}}i\\ \\ &i=2:\quad -2^{\frac{2}{2}}\\ \\ &i=3:\quad -2^{\frac{3}{2}}i \\ \\ &i=4:\quad 2^{\frac{4}{2}}\\ \\ &i=5:\quad 2^{\frac{5}{2}}i\\ \\ &i=6:\quad -2^{\frac{6}{2}} \end{align} i=1:221ii=2:222i=3:223ii=4:224i=5:225ii=6:226
发现明显规律且周期T=4T=4T=4

a=−2a=\sqrt{ -2 }a=2,则必有22×ap=ap+42^2\times a^p=a^{p+4}22×ap=ap+4
进一步推广:
22k×ap=ap+4k2^{2k}\times a^p=a^{p+4k} 22k×ap=ap+4k
现在解决了222的偶数次幂与aaa的任意次幂相乘的递推,如果能够解决222的奇数次幂与aaa任意次幂相乘的递推,那么就可以通过对多项式系数CiC_{i}Ci二进制分解不断递推,将所有系数化为{0,1}\{ 0,1 \}{0,1}

由于22k+1=22k×22^{2k+1}=2^{2k}\times 222k+1=22k×2,因此解决2×ap2\times a^p2×ap的递推即可

观察表格可知2×ap=−ap+22\times a^p=-a^{p+2}2×ap=ap+2,即2×ap+ap+2=02\times a^p+a^{p+2}=02×ap+ap+2=0
因此有2×ap+ap+2=2×ap+2+ap+4=02\times a^p+a^{p+2}=2\times a^{p+2}+a^{p+4}=02×ap+ap+2=2×ap+2+ap+4=0
则有:
2×ap=ap+2+ap+42\times a^p=a^{p+2}+a^{p+4} 2×ap=ap+2+ap+4
这样就能不断地将系数向高次推推推,最终全部推成{0,1}\{ 0,1 \}{0,1}啦!

然而,聪明的phaethon90phaethon 90phaethon90发现了问题:
如果原本的多项式在推导过程中包含形如2×ap+ap+2+…2\times a^p+a^{p+2}+\dots2×ap+ap+2+的部分,那么对2×ap2\times a^p2×ap套用上述递推将导致无限循环,因为2×ap+ap+2=02\times a^p+a^{p+2}=02×ap+ap+2=0

因此,在使用第二个递推前,先判断ap+2a^{p+2}ap+2项的系数是否为奇数:

  • 如果为奇数,那么就可以利用2×ap+ap+2=02\times a^p+a^{p+2}=02×ap+ap+2=0将这个奇数消去,避免在处理到p+2p+2p+2位时仍然是个奇数
  • 如果为偶数,那么可以利用递推二2×ap=ap+2+ap+42\times a^p=a^{p+2}+a^{p+4}2×ap=ap+2+ap+4往高位推

当更新过的最高位已经与当前位重合了,那么就退出循环

fun fact:这个代码在赛事实际上早就写好了,但是因为不知道如何给FFT清空,以及没有发现最后输出的多项式的项数size远大于size(A)+size(B),导致没有清空完全,一直在WAAAAA

代码实现

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<unordered_map>
#include<numeric>
using namespace std;
using ll = long long;
#define rep(i, a, b) for(ll i = (a); i <= (b); i ++)
#define per(i, a, b) for(ll i = (a); i >= (b); i --)
#define see(stl) for(auto&ele:stl)cout<<ele<<" "; cout<<'\n';
constexpr ll inf = 1e9 + 5;
#define int ll
#define double long double
constexpr ll  mod = 998244353;const double pi = acos(-1);const int N = 4e5 + 5;struct complex {double x, y;complex operator+(const complex& t)const {return{ x + t.x,y + t.y };}complex operator-(const complex& t)const {return{ x - t.x,y - t.y };}complex operator*(const complex& t)const {return{ x * t.x - y * t.y,x * t.y + y * t.x };}
}A[N], B[N];
int R[N];void FFT(complex A[], int n, int op) {rep(i, 0, n - 1)R[i] = R[i / 2] / 2 + ((i & 1) ? n / 2 : 0);rep(i, 0, n - 1)if (i < R[i])swap(A[i], A[R[i]]);for (int i = 2; i <= n; i <<= 1) {complex w1({ cos(2 * pi / i),sin(2 * pi / i) * op });for (int j = 0; j < n; j += i) {complex wk({ 1,0 });rep(k, j, j + i / 2 - 1) {complex x = A[k], y = A[k + i / 2] * wk;A[k] = x + y; A[k + i / 2] = x - y;wk = wk * w1;}}}
}
int n = 0, m = 0,pos=0;
int ans[N+10];
void eachT() {string s1, s2; cin >> s1 >> s2;int up=max(n,m);up=max(up,pos);rep(i, 0, up+5) {A[i] = B[i] = { 0,0 };R[i] =ans[i]=0;}n = s1.length() - 1, m = s2.length() - 1;rep(i, 0, n)A[i].x = s1[n - i] - '0', A[i].y = 0;rep(i, 0, m)B[i].x = s2[m - i] - '0', B[i].y = 0;for (m = n + m, n = 1; n <= m; n <<= 1);FFT(A, n, 1); FFT(B, n, 1);rep(i, 0, n - 1)A[i] = A[i] * B[i];FFT(A, n, -1);int highid = 0;bool all0 = 1;rep(i, 0, m) {ans[i] = (int)(A[i].x / n + 0.5);if (ans[i] != 0)all0 = 0;if (ans[i] > 0 && i > highid) {highid = i;}}if (all0) {cout << 0 << '\n';return;}pos = 0;while (1) {int k = ans[pos], cnt = 0;ans[pos] = (k & 1);k >>= 1;while (k) {cnt++;//2^cntif (k & 1) {if (cnt % 2 == 0) {//2^2kans[pos + 4 * cnt / 2];ans[pos + 4 * cnt / 2]++;highid=max(highid,pos + 4 * cnt / 2);}else {if (cnt / 2 == 0) {//2^1if (ans[pos + 2] % 2 == 0) {ans[pos + 4];ans[pos + 4] += 1;ans[pos + 2] += 1;highid=max(highid,pos + 4);}else {ans[pos + 2] -= 1;highid=max(highid,pos + 2);}}else {//2^2k+1ans[pos + cnt / 2 * 4];ans[pos + cnt / 2 * 4] += 2;highid=max(highid,pos + cnt / 2 * 4);}}}k >>= 1;}if (pos == highid)break;pos++;}int st = pos;per(i, pos, 0){if (ans[i] != 0){st = i;break;}}if(st==pos&&ans[pos]==0){cout<<0<<'\n';return;}per(i, st, 0)cout << ans[i];cout << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);ll t = 1;cin >> t;while (t--) {eachT();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92938.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataEase官方出品丨SQLBot:基于大模型和RAG的智能问数系统

2025年8月7日&#xff0c;DataEase开源项目组发布SQLBot开源项目&#xff08;github.com/dataease/SQLBot&#xff09;。SQLBot是一款基于大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;和RAG&#xff08;Retrieval Augmented Generation&#xff0c;…

第十四节 代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。介绍意图&#xff1a;为其他对象提供一种代理以控制对…

训推一体 | 暴雨X8848 G6服务器 x Intel®Gaudi® 2E AI加速卡

近日&#xff0c;暴雨信息携手英特尔&#xff0c;针对Gaudi 2E AI加速器HL-288 PCIe卡&#xff08;简称IntelGaudi 2E PCIe卡&#xff0c;下同&#xff09;完成专项调优与适配工作&#xff0c;并重磅推出Intel Eagle Stream平台4U8卡解决方案。该方案通过软硬件协同优化&#x…

GB17761-2024标准与电动自行车防火安全的技术革新

随着我国电动自行车保有量突破3.5亿辆&#xff0c;这一便捷的交通工具已成为城市出行的重要组成。然而&#xff0c;伴随市场规模扩大而来的是日益突出的安全问题——2023年全国电动自行车火灾事故高达2.5万起&#xff0c;年均增长率约20%&#xff0c;火灾中塑料件加速燃烧并释放…

利用容器编排完成haproxy和nginx负载均衡架构实施

1 创建测试目录和文件[rootdocker-a ~]# mkdir lee [rootdocker-a ~]# cd lee/ [rootdocker-a lee]# touch docker-compose.yml # 容器编排工具Docker Compose 默认识别docker-compose.yml文件2 编写docker-compose.yml文件和haproxy.cfg文件2.1 核心配置说明2.1.1 服务结构共定…

WinRAR v7.13 烈火汉化稳定版,解压缩全格式专家

[软件名称]: WinRAR v7.13 烈火汉化稳定版 [软件大小]: 3.8 MB [下载通道]: 夸克盘 | 迅雷盘 软件介绍 WinRAR 压缩文件管理器&#xff0c;知名解压缩软件&#xff0c;电脑装机必备软件&#xff0c;国内最流行最好用的压缩文件管理器、解压缩必备软件。它提供 RAR 和 ZIP 文…

强化学习常用数据集

强化学习常用数据集数学推理数据集数值标签GSM8K&#xff08;2021 OpenAI)问答数据集在LLM场景下进行强化学习训练的时候&#xff0c;时常会涉及到各种各样的数据集&#xff0c;容易记不住&#xff0c;因此开个帖子记录一下。可采取的分类方法有很多&#xff0c;这里直接按照领…

ROS2学习(1)—基础概念及环境搭建

文章目录核心框架环境搭建小乌龟机器人控制小乌龟启动键盘控制启动rqt查看ros节点关系核心框架 这里有几个比较重要的概念&#xff1a; 四大通信机制&#xff1a;话题&#xff08;Topic&#xff09;、服务&#xff08;Service&#xff09;、动作&#xff08;Action&#xff09…

基于STM32单片机超声波测速测距防撞报警设计

1 系统功能介绍 本设计是一套基于 STM32F103C8T6 单片机 的超声波测速测距防撞报警系统&#xff0c;能够实现对目标物体的实时测距与测速&#xff0c;并通过 TFT 彩屏进行动态显示&#xff0c;同时根据用户设定的距离与速度阈值进行报警提示。该系统不仅可以用于固定场景的安全…

麒麟系统播放 pptx

目录 python 操作 LibreOffice 控制pptx 一页一页播放 1. 安装 LibreOffice&#xff08;麒麟系统基于 Debian/Ubuntu&#xff09; 2. 如果只想安装 PPT 播放/转换&#xff08;Impress&#xff09; 1. 启动 LibreOffice UNO 服务 2. Python 控制播放uno安装方法&#xff1a…

嵌入式Linnux学习 -- 软件编程2

四、IO1. 概念1. IO 指 input / output2. Linux系统中一切皆是文件3. IO操作的对象是文件2. 文件1. 概念一段数据的集合2. 特点文件通常存放在外存中&#xff0c;掉点后数据不会丢3. 分类b&#xff08;block&#xff0c;块设备文件&#xff09;-- 按块扫描信息的文件&#x…

Spark02 - SparkContext介绍

一、应用入口&#xff1a;SparkContextSpark Application 程序入口为&#xff1a;SparkContext&#xff0c;任何一个应用首先需要构建 SparkContext 对象&#xff0c;如下两步构建&#xff1a;第一步、创建 SparkConf 对象设置 Spark Application 基本信息&#xff0c;比如应用…

Selenium动态元素定位

动态元素定位方法一&#xff1a;使用CSS选择器通过部分匹配操作符定位动态属性中的固定部分。*&#xff08;包含&#xff09;&#xff0c;^&#xff08;开头&#xff09;&#xff0c;$&#xff08;结尾&#xff09;。/* 匹配id前缀为user_的元素 */ cssdiv[id^"user_"…

OBOO鸥柏丨115寸商用屏/工业液晶显示器招标投标核心标底参数要求

整机参数要求&#xff1a;商用液晶显示器/工业LCD一体机/商业智能终端机/工业防爆显示器/招标投标核心标底参数要求1、整机屏幕采用≥采用115英寸超高清原厂原包原装工业LCD液晶屏面板&#xff1b;具有高色域&#xff0c;显示动态视频、web及3D动画时&#xff0c;保障运动画面流…

麻溜启动Oracle实例demo

注意&#xff1a;镜像非常大并且外网网络过慢&#xff0c;可能得pull一天&#xff08;n次超时&#xff09;。。md后台静默pull命令&#xff1a; nohup docker pull container-registry.oracle.com/database/express:latest > pull.log 2>&1 & 启动实例&#xff1…

应用监控工具Skywalking

目录 Skywalking介绍 Skywalking架构 Skywalking安装 Skywalking使用 Skywalking配置 Skywalking数据持久化 Skywalking告警 Skywalking介绍 Apache Skywalking是一个开源的应用性能监控&#xff08;Application Performance Monitoring&#xff0c;APM&#xff09;工具…

TCP服务建立的全流程详解

TCP的服务监听步骤&#xff08;等待客户端连接前&#xff09;TCP 服务器通过以下步骤完成从初始化到等待客户端连接&#xff0c;为后续的数据传输&#xff08;send()/recv()&#xff09;奠定了基础一、创建套接字&#xff08;Socket&#xff09;作用&#xff1a;套接字是网络通…

数据结构 双链表与LinkedList

本节目标&#xff1a; 认识并且能够实现一个双链表认识LinkedList类并且知道如何去使用 1.双链表 概念 在数据结构中&#xff0c;双链表&#xff08;Doubly Linked List&#xff09; 是一种常见的线性数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点不仅包含数据…

如何解决 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本区域选择问题:key is invalid

如何解决 JetBrains IntelliJ IDEA 2024.2 和 2025.2 新版本区域选择问题&#xff1a;key is invalid 在 JetBrains 发布的 IntelliJ IDEA、PyCharm 2024.2 和 2025.2 新版本中&#xff0c;增加了一个新的功能——区域选择。在设置菜单中&#xff0c;你可以找到这一选项&#…

GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略

目录 前言 一、百度天气JSON 1、请求参数 2、返回参数 3、属性映射 二、GSON属性映射实战 1、类对象映射 2、属性字段映射 3、日期数据映射 三、天气接口对象展示 1、接口调用 2、Java属性打印输出 四、总结 前言 在当今数字化时代&#xff0c;数据的高效处理与转换…