[UOJ UNR#2 黎明前的巧克力]

来自FallDream的博客,未经允许,请勿转载,谢谢。


传送门

 

很奇妙的一道题

首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2,最后输出f[0]即可。

这样我就考虑从FWT之后的数组入手。

首先发现F[0]=1只会让最后的数组全部+1,所以只考虑F[ai]=2的影响。

发现每个项只会是3或者-1,这取决于FWT过程中的取反次数。

所以可以设计一个dp,f[i][x]表示分治到第i层,x是2的方案数,F[i][x]表示....,x是-2的方案数。

这样模拟FWT进行dp即可,最后通过快速幂计算出变换后最终的数组,再逆变换回去就是答案啦。

#include<iostream>
#include<cstring>
#include<cstdio>
#define MN 1048576
#define mod 998244353
using namespace std;
inline int read()
{
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
const int Inv2=(mod+1)/2;
int s[MN+5],S[MN+5],n,f[22][MN+5],F[22][MN+5],num[MN+5],sum;

inline int pow(int x,int k)
{
    for(sum=1;k;k>>=1,x=1LL*x*x%mod)
        if(k&1) sum=1LL*sum*x%mod;
    return sum;
}

void FWT(int l,int r)
{
    if(l==r) return;
    int mid=l+r>>1;FWT(l,mid);FWT(mid+1,r);
    for(int i=0;i<=mid-l;++i)
    {
        int x=s[l+i],y=s[mid+1+i];
        s[l+i]=1LL*(x+y)*Inv2%mod;
        s[mid+1+i]=1LL*(x-y+mod)*Inv2%mod;
    }
}

void Solve(int l,int r,int dep)
{
    if(l==r){f[dep][l]=num[l];return;}
    int mid=l+r>>1;Solve(l,mid,dep+1);Solve(mid+1,r,dep+1);
    for(int i=0;i<=mid-l;++i)
    {
        f[dep][l+i]=f[dep+1][l+i]+f[dep+1][mid+1+i];
        F[dep][l+i]=F[dep+1][l+i]+F[dep+1][mid+1+i];
        f[dep][mid+1+i]=f[dep+1][l+i]+F[dep+1][mid+1+i];
        F[dep][mid+1+i]=F[dep+1][l+i]+f[dep+1][mid+1+i];
    }
}

int main()
{
    n=read();
    for(int i=1;i<=n;++i) ++num[read()];
    Solve(0,MN-1,1);
    for(int i=0;i<MN;++i)
    {
        s[i]=pow(3,f[1][i]);
        if(F[1][i]&1) s[i]=(mod-s[i])%mod;
    }
    FWT(0,MN-1);
    printf("%d\n",(s[0]-1+mod)%mod);
    return 0;
}

 

转载于:https://www.cnblogs.com/FallDream/p/uoj310.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值