题目链接:

[清华集训2016]石家庄的工人阶级队伍比较坚强

题目大意:有$n=3^m$个人玩石头剪刀布,共$t$轮游戏,每轮每个人要和包括自己的所有人各进行$m$次石头剪刀布。每个人在$m$轮中的决策固定,即为这个人编号的长度为$m$的三进制(其中$0$表示剪刀、$1$表示石头、$2$表示布,不足$m$位用$0$补齐)。每个人有一个初始分数$f_{0,x}$,给出一个分数矩阵$b$,其中$b_{i,j}$表示赢了$i$局输了$j$局的得分,在第$i$轮结束后,第$x$个人的分数为$f_{i,x}=\sum\limits_{0\le y\le n}{ }f_{i-1,y}b_{u,v}$。其中$b_{u,v}$表示$x$与$y$石头剪刀布,$x$赢了$u$次,输了$v$次的得分。求$t$轮后每个人的得分。

首先因为每个人的决策是固定的,所以转移关系也是恒定的,我们设它是一个矩阵$B$,其中$B_{i,j}$表示$i$与$j$游戏时$i$获得的分数。那么要求的就是$f_{n}=f_{0}B^n$。
我们定义三进制不进位加法为$\oplus$,不退位减法为$\ominus$,他们互为逆运算(与二进制下的异或类似)。
那么对于$\forall k<3^m,B_{i,j}=B_{i\oplus k,j\oplus k}$,同理$B_{i,j}=B_{i\ominus j,0}$。而这个结论也可以推广到$B^n$,即$\forall k<3^m,B_{i,j}^{n}=b_{i\ominus j,0}^{n}$。
那么$f_{n,i}=\sum\limits_{k=0}^{3^m-1}f_{0,k}B_{k,i}^n=\sum\limits_{k=0}^{3^m-1}f_{0,k}B_{0,i\ominus k}^n=\sum\limits_{x\oplus y=i}f_{0,x}B_{0,y}^n$
所以,我们只需要$B$矩阵的第一行就够了,又因为
$B_{0,i}^n=\sum\limits_{k=0}^{3^m-1}B_{0,k}^{n-1}B_{k,i}=\sum\limits_{k=0}^{3^m-1}B_{0,k}^{n-1}B_{0,i\ominus k}=\sum\limits_{x\oplus y=i}B_{0,x}^{n-1}B_{0,y}$
所以只需要将$B_{0}$做$n$次卷积然后和$f_{0}$做一次卷积即可得到答案。
也就是说我们需要找到一个三进制不进位加法卷积,这种模意义下的卷积也叫循环卷积。
其实在我们熟悉的卷积中就有类似的存在——FWT的异或卷积
可以发现FWT异或卷积实际上就是二进制不进位加法卷积。
我们先来研究一下FWT异或卷积:
设$bitcount(i)$表示$i$二进制中$1$的个数。
因为$bitcount(i\&k)$的奇偶性异或$bitcount(j\&k)$的奇偶性等于$bitcount((i\oplus j)\&k)$的奇偶性
那么我们就可以构造出正变换$F(k)=\sum(-1)^{bitcount(i\&k)}f(i)$
可以发现上述式子中的$bitcount(i)$也就是$i$的二进制每一位数的和,而$\&$就是二进制下的不进位乘法、$\oplus$是二进制下不进位加法
那么我们同样可以将这些扩展到三进制中,即$bitcount_{3}(i)$表示$i$的三进制每一位数的和、$\&_{3}$表示三进制下的不进位乘法、$\oplus_{3}$表示三进制下的不进位加法
而上述结论在三进制下也依旧成立
即$(bitcount_{3}(i\&_{3}k)\%3)\oplus_{3}(bitcount_{3}(i\&_{3}k)\%3)=bitcount((i\oplus_{3}j)\&_{3}k)$
那么现在只需要找到一个能代替上式中$-1$的数就能完成这个三进制不进位加法卷积了,而这个数$w$要满足$w^{i}=w^{i\%3}$,所以只要用三次单位根就行了($FWT$中的$-1$也就是二次单位根)!
这里为了方便可以将所有复数都表示成$a+bw$,因为$w^2+w+1=0$,所以$w^2=-w-1$。
对于两个复数相乘就是$(a+bw)*(c+dw)=ac+(bc+ad)w+bd(-w-1)=(ac-bd)+(ad+bc-bd)w$
因为最后要乘上$3^m$的逆元,所以要求$3^m$与$p$互质。
假设$p$有$3$这个质因子且$k=\frac{p}{3}$,那么$\frac{1}{k+1}+\frac{1}{k(k+1)}=\frac{1}{k}=\frac{3}{p}$,与题面矛盾,因此保证了$3^m$有逆元。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
int n,m,t,mod;
int a[20][20];
int x[600010];
int y[600010];
struct miku
{int x,y;miku(){}miku(int X,int Y){x=X,y=Y;}miku s(){return miku((mod-y)%mod,(x-y+mod)%mod);}miku t(){return miku((y-x+mod)%mod,(mod-x)%mod);}miku operator +(const miku &res){return miku((x+res.x)%mod,(y+res.y)%mod);}miku operator -(const miku &res){return miku((x-res.x+mod)%mod,(y-res.y+mod)%mod);}miku operator *(const miku &res){return miku((1ll*x*res.x%mod-1ll*y*res.y%mod+mod)%mod,(1ll*x*res.y%mod+1ll*y*res.x%mod-1ll*y*res.y%mod+mod)%mod);}
}f[600010],g[600010];
miku quick_pow(miku x,int y)
{miku res=miku(1,0);while(y){if(y&1){res=res*x;}y>>=1;x=x*x;}return res;
}
void exgcd(int a,int b,int &x,int &y)
{if(!b){x=1,y=0;}else{exgcd(b,a%b,y,x);y-=a/b*x;}
}
int get_inv()
{int x,y;exgcd(n,mod,x,y);return x=(x%mod+mod)%mod;
}
void FWT(miku *a)
{for(int i=1;i<n;i*=3){for(int l=i*3,j=0;j<n;j+=l){for(int k=0;k<i;k++){miku t[3]={a[j+k],a[j+k+i],a[j+k+i+i]};a[j+k]=t[0]+t[1]+t[2];a[j+k+i]=t[0]+t[1].s()+t[2].t();a[j+k+i+i]=t[0]+t[1].t()+t[2].s();}}}
}
void IFWT(miku *a)
{for(int i=1;i<n;i*=3){for(int l=i*3,j=0;j<n;j+=l){for(int k=0;k<i;k++){miku t[3]={a[j+k],a[j+k+i],a[j+k+i+i]};a[j+k]=t[0]+t[1]+t[2];a[j+k+i]=t[0]+t[1].t()+t[2].s();a[j+k+i+i]=t[0]+t[1].s()+t[2].t();}}}int inv=get_inv();for(int i=0;i<n;i++){a[i].x=1ll*a[i].x*inv%mod;}
}
int main()
{scanf("%d%d%d",&m,&t,&mod);n=1;for(int i=1;i<=m;i++){n*=3;}for(int i=0;i<n;i++){scanf("%d",&f[i].x);x[i]=x[i/3]+(i%3==1);y[i]=y[i/3]+(i%3==2);}for(int i=0;i<=m;i++){for(int j=0;i+j<=m;j++){scanf("%d",&a[i][j]);}}for(int i=0;i<n;i++){g[i].x=a[x[i]][y[i]];}FWT(f);FWT(g);for(int i=0;i<n;i++){f[i]=f[i]*quick_pow(g[i],t);}IFWT(f);for(int i=0;i<n;i++){printf("%d\n",f[i].x);}
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10272505.html

[清华集训2016]石家庄的工人阶级队伍比较坚强——三进制FWT相关推荐

  1. UOJ#272. 【清华集训2016】石家庄的工人阶级队伍比较坚强

    传送门 设运算 \(op1,op2\),一个表示三进制不进位的加法,一个表示不退位的减法 设 \(cnt1[x],cnt2[x]\) 分别表示 \(x\) 转成三进制后 \(1/2\) 的个数 那么 ...

  2. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  3. 【清华集训2016】数据交互

    [清华集训2016]数据交互 比较神的\(DDP\). 首先对于给出的一条链我们分两部分统计:\(lca\)以及其他部分. 我们设两个变量\(w_i,g_i\).一条路径的权值就是路径上所有点的\(w ...

  4. P6669 [清华集训2016] 组合数问题

    P6669 [清华集训2016] 组合数问题 题意: 给你n,m,k,问有多少对(i,j)满足K∣CijK|C_{i}^{j}K∣Cij​ (Cij是k的倍数C_{i}^{j}是k的倍数Cij​是k的 ...

  5. [清华集训2016]你的生命已如风中残烛——组合数学

    题目链接: [清华集训2016]你的生命已如风中残烛 题目大意:共有$m+1$张牌,其中有$n$张特殊牌,每张特殊牌有一个权值$w_{i}$表示取到这张牌能获得$w_{i}$次再抽牌的机会,保证$\s ...

  6. uoj#268. 【清华集训2016】数据交互(动态dp+堆)

    传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...

  7. 【清华集训2016】Alice和Bob又在玩游戏

    不难的题目.因为SG性质,所以只需要对一棵树求出. 然后如果发现从上往下DP不太行,所以从下往上DP. 考虑一个点对子树的合并,考虑下一个删的点在哪一个子树,那么剩下的状态实际上就是把一个子树所有能达 ...

  8. BZOJ.4738.[清华集训2016]汽水(点分治 分数规划)

    BZOJ UOJ 记\(val_i\)是每条边的边权,\(s\)是边权和,\(t\)是经过边数,\(k\)是给定的\(k\). 在点分治的时候二分答案\(x\),设\(|\frac st-k|=x\) ...

  9. BZOJ 4734 UOJ #269 [清华集训2016]如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

最新文章

  1. idea设置开发方式
  2. 每日一皮:不同的视角看待问题...
  3. dcn和dcnv2 torch
  4. ASP.NET Core 数据加解密的一些坑
  5. 在职研究生和全日制研究生的区别_“在职研究生”与“全日制研究生”有什么区别?...
  6. stm32 SysTick
  7. 开源上网行为管理_做好企业上网行为管理作用大
  8. linux 切换到最左边,Ubuntu 18.04中使用Mac OS风格的Dock启动器替换左侧面板
  9. Bug(二)——error LNK1104:无法打开“opengl32.lib”
  10. js基础-17-解析url的函数,字符串出现的次数最多,并统计它出现几次
  11. strcpy_s函数
  12. SkipList算法原理分析
  13. 渗透测试中遇到的Adminer任意文件读取漏洞
  14. 基于OpenSSL,实现C语言SM2的PKCS10的证书请求
  15. nginx中配置不输入端口(指定地址)访问项目的方法
  16. 专访腾讯安全王雷雷丨构建智能风控体系,护航私域营销安全
  17. 骨灰级的魔兽伤害计算(包括物理和…
  18. firebase 推送_使用Firebase Cloud Messaging发送推送通知
  19. 「高效程序员的修炼」代码版本管理工具 Git 用起来 01 Git 基础
  20. 三维地图(3D地图)离线地图开发发布时间:2020-03-03 版权:

热门文章

  1. 论如何寻找万一的川财证券开户渠道
  2. Silverlight 2 Beta 1, IE 8 Beta 1, ASP.NET MVC 预览版2 可以下载了 - 思归呓语 - 博客堂
  3. python UnicodeEncodeError: 'gbk' codec can't encode character ...
  4. WordPress 全方位优化指南(下)
  5. 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
  6. aspx 与 ashx cs
  7. TreeView控件结合js树形选择 .
  8. QuickPager asp.net 分页控件 转
  9. R语言入门第三集 实验二:基本数据处理
  10. 数据挖掘原理与算法:练习题2