【学习笔记】[AGC047] Product Simulation
给你两种操作: a k ← a i + a j a_k\gets a_i+a_j ak←ai+aj, a k ← [ a i < a j ] a_k\gets [a_i<a_j] ak←[ai<aj] ,让你用上述操作构造运算 A × B A\times B A×B, A A A, B B B未知。
sol:思维题。首先我们要知道目的是用上述两种简单运算构造出比较复杂度情况,这里有一个引理:
1.1 1.1 1.1 若 A , B ∈ { 0 , 1 } A,B\in \{0,1\} A,B∈{0,1},那么 A × B = [ 1 < A + B ] A\times B=[1<A+B] A×B=[1<A+B]
这条引理告诉我们如何构造最为基本的乘法运算。
让我们想想。什么样的数只有 0 / 1 0/1 0/1 ?显然 数的二进制表示。
考虑一般情况。设 A = ( a n a n − 1 . . . a 0 ) 2 A=(a_na_{n-1}...a_0)_2 A=(anan−1...a0)2, B = ( b m b m − 1 . . . b 0 ) 2 B=(b_mb_{m-1}...b_0)_2 B=(bmbm−1...b0)2,那么 A × B = ∑ i = 0 n ∑ j = 0 m ( a i b j ) i + j A\times B=\sum_{i=0}^n\sum_{j=0}^m(a_ib_j)^{i+j} A×B=∑i=0n∑j=0m(aibj)i+j 。而我们知道 x 2 i x2^i x2i可以通过将 x x x自我复制 i i i次得到,因此我们只需将 A A A, B B B二进制拆分即可。
如何拆分?我们从高到低位考虑,最高位等价于 [ A ≥ 2 k ] [A\ge 2^k] [A≥2k],对于低位只需抵消高位的影响即可。(在式子右边加上之前分出来的高位)以此类推,可以递推的把每一位求出来。
总序列长度 O ( log 3 n ) O(\log^3 n) O(log3n)。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530001.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-03-30 【题解】[SHOI2011] 银行家