#4736. Tritwise Mex

题目描述

给出两个长度为 3k 的数组 a,b ,求数组 cc[i]=mex3(j,k)=iajbk ,其中 mex3(i,j) 表示将 i,j 化成 3 进制数,每一位都取 mex 后的值。

题解

其实想法挺自然的考场上不知道在干啥。

考虑求出 c[0×3x+i],c[1×3x+i],c[2×3x+i] 的值

c[0×3x+i]=mex3(j,k)=i(a[1×3x+j]+a[2×3x+j])(b[1×3x+k]+b[2×3x+k])
c[1×3x+i]=mex3(j,k)=i(a[0×3x+j]+a[2×3x+j])(b[0×3x+k]+b[2×3x+k])a[2×3x+j]b[2×3x+k]
c[2×3x+i]=mex3(j,k)=ia[0×3x+j]b[1×3x+k]+a[1×3x+j]b[0×3x+k]

所以发现我们可以把原式的操作看成一次卷积,设 A0(x)=ia[0×3x+i] ,剩下的同理,则
C0(x)=(A1(x)+A2(x))(B1(x)+B2(x))
C1(x)=(A0(x)+A2(x))(B0(x)+B2(x))A2(x)B2(x)
C2(x)=(A0(x)+A1(x)+A2(x))(B0(x)+B1(x)+B2(x))C0(x)C1(x)

于是递归处理即可。

代码

复制代码
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=6e5+5;int n,m;
LL a[N][15],b[N][15],c[N][15];
void solve(int k,int d){
    if (d==1){
        c[0][d]=(a[1][d]+a[2][d])*(b[1][d]+b[2][d]);
        c[1][d]=(a[0][d]+a[2][d])*(b[0][d]+b[2][d])-a[2][d]*b[2][d];
        c[2][d]=a[0][d]*b[1][d]+a[1][d]*b[0][d];
        return;
    }
    k/=3;
    for (int i=0;i<k;i++)
        a[i][d-1]=a[i+k+k][d],b[i][d-1]=b[i+k+k][d];
    solve(k,d-1);
    for (int i=0;i<k;i++) c[i+k][d]=-c[i][d-1];
    for (int i=0;i<k;i++)
        a[i][d-1]+=a[i+k][d],b[i][d-1]+=b[i+k][d];
    solve(k,d-1);
    for (int i=0;i<k;i++) c[i][d]=c[i][d-1];
    for (int i=0;i<k;i++)
        a[i][d-1]=a[i+k+k][d]+a[i][d],
        b[i][d-1]=b[i+k+k][d]+b[i][d];
    solve(k,d-1);
    for (int i=0;i<k;i++) c[i+k][d]+=c[i][d-1];
    for (int i=0;i<k;i++)
        a[i][d-1]+=a[i+k][d],b[i][d-1]+=b[i+k][d];
    solve(k,d-1);
    for (int i=0;i<k;i++)
        c[i+k+k][d]=c[i][d-1]-c[i+k][d]-c[i][d];
}
int main(){
    cin>>m;n=1;
    for (int i=0;i<m;i++) n*=3;
    for (int i=0;i<n;i++)
        scanf("%lld",&a[i][m]);
    for (int i=0;i<n;i++)
        scanf("%lld",&b[i][m]);solve(n,m);
    for (int i=0;i<n;i++) printf("%lld ",c[i][m]);
    return 0;
}
复制代码

 

posted @   xjqxjq  阅读(297)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示