2018牛客网暑期ACM多校训练营(第九场)A




题解:
观察样例感觉是个卷积,然后发现是个xor的FWT。
题意转换成,给个a数组和c数组,求一个b数组,使得a数组和b数组做FWT后的结果为c数组。
然后观察FWT的过程:对a,b数组做FWT,c[i]=a[i]*b[i],然后对c数组做UFWT。
我们把这个过程倒过来:先对c数组做UFWT,然后对a数组做FWT,然后b[i]=c[i]/a[i],最后对b数组做FWT,就把b数组还原了。



代码:

#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define mem(a,b) memset((a),(b),sizeof(a))
#define MP make_pair
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
using namespace __gnu_cxx;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef vector<int> VI;
typedef vector<ll> VL;
void go();
int main(){
    #ifdef tokitsukaze
        freopen("TEST.txt","r",stdin);
    #endif
    go();return 0;
}
const int INF=0x3f3f3f3f;
const ll LLINF=0x3f3f3f3f3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-6;
const int MAX=6e5+10;
const ll mod=1e9+7;
/*********************************  head  *********************************/
namespace FWT
{
    ll inv2;
    const ll p=1e9+7;
    ll pow2(ll a,ll b)
    {
        ll res=1;
        while(b)
        {
            if(b&1) res=res*a%p;
            a=a*a%p;
            b>>=1;
        }
        return res;
    }
    void fwt(ll *a,int n,int v)
    {  
        for(int d=1;d<n;d<<=1)
        {
            for(int m=d<<1,i=0;i<n;i+=m)
            {
                for(int j=0;j<d;j++)
                {  
                    ll x=a[i+j],y=a[i+j+d];
                    if(!v) a[i+j]=(x+y)%p,a[i+j+d]=(x-y+p)%p;
                    else a[i+j]=(x+y)*inv2%p,a[i+j+d]=(x-y+p)%p*inv2%p;
                }
            }
        }
    }
    void XOR(ll *a,ll *b,int n)
    {
        int len;
        for(len=1;len<=n;len<<=1);
        fwt(a,len,0);
        fwt(b,len,0);
        for(int i=0;i<len;i++) a[i]=a[i]*b[i]%p;
        inv2=pow2(2,p-2);
        fwt(a,len,1);
    }
    void XOR_inv(ll *a,ll *b,int n)
    {
        int len;
        for(len=1;len<=n;len<<=1);
        inv2=pow2(2,p-2);
        fwt(a,len,1);
        fwt(b,len,0);
        for(int i=0;i<len;i++) a[i]=a[i]*pow2(b[i]%p,p-2)%p;
        fwt(a,len,0);
    }
};
ll a[MAX],b[MAX];
void go()
{
    int n,i;
    while(read(n))
    {
        for(i=0;i<n;i++) read(b[i]);
        for(i=0;i<n;i++) read(a[i]);
        FWT::XOR_inv(a,b,n);
        for(i=0;i<n;i++) printf("%lld\n",a[i]);
    }
}

全部评论

相关推荐

12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务