题目

给出 \(n\) 个三元组\(\{ a_i,b_i,c_i \}\)和\(x,y,z\);

将每个三元组扩展成(\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\));

问从\(n\)组里面每组选一个数,这\(n\)个数异或值为x 的方案数​\(mod \ 998244353\)是多少;

\(1 \le n \le 10^5 \ , \ 1 \le k \le 17 \ , \ 0 \le x,y,z \le 10^9 \ , 0 \le \ a_i,b_i,c_i \lt 2^k\) ;

题解

  • 最后的答案异或一个 \(\oplus_{i=1}^{n} a_i\) ,令\(\{a_i,b_i,c_i\}\)变成$ { 0 , a_i \wedge b_i , a_i \wedge c_i } $ ;

  • 令\(F_{i,0}+=x \ , \ F_{i,b_i}+=y \ , \ F_{i,c_i}+=z\) ,把所有\(fwt(F_i)\)点乘起来再\(ifwt\)回去即可;

  • 考虑如何求最后的乘积\(\Pi F_i\);

  • 对于\(fwt(F_i)\),每一项一定都是\(x+y+z \ , \ x+y-z \ , \ x-y+z \ , x - y - z\) 之一;

    设纵向的个数为\(i,j,k,l\),解出每一位\(i,j,k,l\)即可快速算出最后的乘积,首先:

    \[\begin{align}
    i +j +k + l = n
    \end{align}
    \]

    令只考虑\(F_i,b_i=1\),设所有\(F\)加起来\(fwt\)到得到对应位值上的值为\(p\)(x=0,y=1,z=0):

    \[i + j - k - l = p
    \]

    同理只令\(F_i,c_i = 1\),有(x=0,y=0,z=1):

    \[i - j + k - l = p
    \]

    令\(F_{i,b_i \wedge c_i}=1\),相当于上面两个的点值乘法,有

    \[i - j - k + l = p
    \]

    解方程即可;

  • 最后\(ifwt\)回来;

    #include<bits/stdc++.h>
    #define mod 998244353
    #define ll long long
    using namespace std;
    const int N=1<<17;
    int n,X,Y,Z,l,s;
    int A[N],B[N],C[N],ans[N];
    char gc(){
    static char*p1,*p2,S[1000000];
    if(p1==p2)p2=(p1=S)+fread(S,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=0;char c=gc();
    while(c<'0'||c>'9')c=gc();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    return x;
    }
    int pw(int x,int y){
    int re=1;
    while(y){
    if(y&1)re=(ll)re*x%mod;
    y>>=1;x=(ll)x*x%mod;
    }
    return re;
    }
    void fwt(int*a){
    for(int i=1;i<l;i<<=1)
    for(int j=0;j<l;j+=i<<1)
    for(int k=0;k<i;++k){
    int t1=a[j+k],t2=a[j+k+i];
    a[j+k]=t1+t2;
    a[j+k+i]=t1-t2;
    }
    }
    void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
    void ifwt(int*a){
    for(int i=1;i<l;i<<=1)
    for(int j=0;j<l;j+=i<<1)
    for(int k=0;k<i;++k){
    int iv2=(mod+1)/2;
    int t1=a[j+k],t2=a[j+k+i];
    a[j+k]=(ll)(t1+t2)*iv2%mod;
    a[j+k+i]=(ll)(t1-t2+mod)*iv2%mod;
    }
    }
    int main(){
    //freopen("H.in","r",stdin);
    //freopen("H.out","w",stdout);
    n=rd();l=1<<rd();
    X=rd();Y=rd();Z=rd();
    for(int i=1;i<=n;++i){
    int a=rd(),b=rd(),c=rd();
    s^=a;b^=a;c^=a;a=b^c;
    A[b]++,B[c]++,C[a]++;
    }
    fwt(A);fwt(B);fwt(C);
    int t1=((ll)X+Y+Z)%mod;
    int t2=((ll)X+Y-Z+mod)%mod;
    int t3=((ll)X-Y+Z+mod)%mod;
    int t4=((ll)X-Y-Z+mod+mod)%mod;
    for(int i=0;i<l;++i){
    ans[i] =
    (ll)pw(t1,(n+A[i]+B[i]+C[i])>>2)
    *pw(t2,(n+A[i]-B[i]-C[i])>>2)%mod
    *pw(t3,(n-A[i]+B[i]-C[i])>>2)%mod
    *pw(t4,(n-A[i]-B[i]+C[i])>>2)%mod;
    }
    ifwt(ans);
    for(int i=0;i<l;++i)printf("%d ",ans[i^s]);
    return 0;
    }

【cf contest 1119 H】Triple的更多相关文章

  1. 【cf contest 1119 G】Get Ready for the Battle

    题目 你有\(n\)个士兵,需要将他们分成\(m\)组,每组可以为0: 现在这些士兵要去攻打\(m\)个敌人,每个敌人的生命值为\(hp_i\) : 一轮游戏中一组士兵选定一个攻打的敌人,敌人生命值- ...

  2. 【codeforces contest 1119 F】Niyaz and Small Degrees

    题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...

  3. B. Lost Number【CF交互题 暴力】

    B. Lost Number[CF交互题 暴力] This is an interactive problem. Remember to flush your output while communi ...

  4. 【CF contest/792/problem/E】

    E. Colored Balls time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  6. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  7. 【郑轻邀请赛 H】 维克兹的进制转换

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2134 [题意] [题解] 设f[i]表示数字i分解为二进制数的方案数; 则 如果i为 ...

  8. 【cf 483 div2 -C】Finite or not?(数论)

    链接:http://codeforces.com/contest/984/problem/C 题意 三个数p, q, b, 求p/q在b进制下小数点后是否是有限位. 思路 题意转化为是否q|p*b^x ...

  9. 【CF 189A Cut Ribbon】dp

    题目链接:http://codeforces.com/problemset/problem/189/A 题意:一个长度为n的纸带,允许切割若干次,每次切下的长度只能是{a, b, c}之一.问最多能切 ...

随机推荐

  1. -透明度中百分比与十六进制的对应关系 MD

    目录 目录 透明度中百分比与十六进制的对应关系 计算代码 对应关系表 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao ...

  2. Java 的 WebSocket

    1. WebSocket 是什么 一言以蔽之,WebSocket允许服务器「主动」给浏览器发消息,如教程演示截图,服务器会主动推送比特币价格给浏览器. 2. 为什么要用 WebSocket 实时获取服 ...

  3. 手写ORM入门篇(一)

    对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 . ...

  4. 2019 东方明珠java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东方明珠等公司offer,岗位是Java后端开发,最终选择去了东方明珠. 面试了很多家公司,感觉大部分公司考察的点 ...

  5. Python的bytes和str

    Python和C的字符串 在Python 3 中,bytes单独作为一个类型,不再和str类型混在一起.关于字符串和字节,我想先回顾下C/C++ 在C/C++中,字符串是由char数组构成,每个元素是 ...

  6. 【开发笔记】- QQ消息轰炸

    1.右键新建一个文本文件: 2.打开记事本将如下代码复制过去: On Error Resume Next Dim wsh,ye set wsh=createobject("wscript.s ...

  7. mouseleave和mouseout的区别

    http://www.w3school.com.cn/tiy/t.asp?f=jquery_event_mouseleave_mouseout

  8. FFMPEG_avi转码到mp4(aac+h264)源码

    #include <ffmpeg/avcodec.h>#include <ffmpeg/avformat.h>#include <stdio.h>#include ...

  9. composer的用法笔记

    一.到compose官网下载 composer.exe 的安装的文件,直接打开安装,在安装的目录的要选择到,你的开发环境中的 php.exe 的所在目录里..例如:D:\phpStudy\php\ph ...

  10. Linux系统 jboss/Tomcat服务器pdf文件乱码问题

    1.新搭建的环境,但是没有字符集,在windows上的电脑上复制了一份宋体, 字体C:\WINDOWS\FONTS\simsun.ttc(也就是宋体,大小为10M),把他重命名为 simsun.ttf ...