题目分析:

首先不难注意到式子就是异或卷积,所以考虑用分治乘法推出优化方法。
我们把一个整体$f$拆成$f-,f\pm,f+$,然后另一个拆成$g-,g\pm,g+$.这样做的好处是能更清楚的分析问题。下面我们下宽油(大雾)。
发现三个部分要求的式子是在两者相乘中选不同的三个,所以我们发现三个部分中每取一个有相同。这样我们聚焦到$--,-\pm,-+$三个东西。观察二进制FWT,可以假想它们要使用到三次单位根。这样只需要把三个根错开排列就行了。
做分治乘法的时候注意把虚部的$I$记做$\sqrt{3}i$.

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; struct cn{int rl,vir;}e[]; // vir's real meaning is vir*sqrt(3) int iv2,iv3;
int m,n,t,p,phi;
int b3[],b[][];
cn val[maxn],f[maxn]; int W[maxn],L[maxn]; cn operator +(const cn& alpha,const cn& beta){
cn ans = (cn){alpha.rl+beta.rl,alpha.vir+beta.vir};
if(ans.rl >= p) ans.rl -= p;
if(ans.vir >= p) ans.vir -= p;
return ans;
}
cn operator *(const cn& alpha,const cn& beta){
cn ans = (cn){,};
ans.rl = (1ll*alpha.rl*beta.rl-3ll*alpha.vir*beta.vir)%p;
ans.rl += p; if(ans.rl >= p) ans.rl -= p;
ans.vir = (1ll*alpha.vir*beta.rl+1ll*alpha.rl*beta.vir)%p;
return ans;
}
cn operator *(const cn& alpha,const int& beta){
cn ans=alpha;ans.rl=(1ll*ans.rl*beta)%p;ans.vir=(1ll*ans.vir*beta)%p;
return ans;
} cn fast_pow(cn now,int pw){
int bit = ;cn ans = (cn){,},dt = now;
while(bit <= pw){
if(bit & pw) ans = ans*dt;
bit<<=;dt = dt*dt;
}
return ans;
}
int fast_pow(int now,int pw){
int bit = ,ans = ,dt = now;
while(bit <= pw){
if(bit & pw) ans = (1ll*ans*dt)%p;
bit<<=;dt = (1ll*dt*dt)%p;
}
return ans;
} void read(){
scanf("%d%d%d",&m,&t,&p);
b3[] = ; for(int i=;i<=m;i++) b3[i] = b3[i-]*;
n = b3[m];
for(int i=;i<n;i++) scanf("%d",&f[i].rl);
for(int i=;i<=m;i++){
for(int j=;i+j<=m;j++){
scanf("%d",&b[i][j]);
}
}
val[].rl = b[][];
for(int i=;i<n;i++){
W[i] = W[i/],L[i] = L[i/];
if(i % == ) L[i]++;
if(i % == ) W[i]++;
val[i].rl = b[W[i]][L[i]];
}
} void multi(int l,int r){
if(l == r-){
f[l] = f[l]*fast_pow(val[l],t);
}else{
int l1 = l+(r-l)/,l2 = l+*(r-l)/,d = l2-l1;
for(int i=;i<d;i++){
cn p1 = f[l+i],p2 = f[l1+i],p3 = f[l2+i];
f[l+i] = p1+p2+p3;
f[l1+i] = p1+e[]*p2+e[]*p3;f[l2+i] = p1+e[]*p2+e[]*p3;
p1 = val[l+i],p2 = val[l1+i],p3 = val[l2+i];
val[l+i] = p1+p2+p3;
val[l1+i] = p1+e[]*p2+e[]*p3;val[l2+i] = p1+e[]*p2+e[]*p3;
}
multi(l,l1); multi(l1,l2); multi(l2,r);
for(int i=;i<d;i++){
cn p1 = f[l+i],p2 = f[l1+i],p3 = f[l2+i];
f[l+i] = p1+p2+p3;
f[l1+i] = p1+e[]*p2+e[]*p3;f[l2+i] = p1+e[]*p2+e[]*p3;
f[l+i]=f[l+i]*iv3;f[l1+i]=f[l1+i]*iv3;f[l2+i]=f[l2+i]*iv3;
}
}
} void init(){
phi = p;int z = p;
for(int i=;i*i<=p;i++){
if(p % i == ){
while(p%i == ) p /= i;
phi = (phi/i)*(i-);
}
}
if(p != ) phi = (phi/p)*(p-); p =z;
iv2 = fast_pow(,phi-); iv3 = fast_pow(,phi-);
e[] = (cn){,}; e[] = (cn){p-iv2,iv2}; e[] = (cn){p-iv2,p-iv2};
} void work(){
multi(,n);//[0,n)
for(int i=;i<n;i++) printf("%d\n",f[i].rl);
} int main(){
read();
init();
work();
return ;
}

UOJ272 [清华集训2016] 石家庄的工人阶级队伍比较坚强 【分治乘法】的更多相关文章

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

    题目链接: [清华集训2016]石家庄的工人阶级队伍比较坚强 题目大意:有$n=3^m$个人玩石头剪刀布,共$t$轮游戏,每轮每个人要和包括自己的所有人各进行$m$次石头剪刀布.每个人在$m$轮中的决 ...

  2. UOJ272. 【清华集训2016】石家庄的工人阶级队伍比较坚强 [FWT]

    UOJ 思路 很容易想到\(O(3^{3m}\log T)\)的暴力大矩乘,显然过不了. 我们分析一下每次转移的性质.题目给的转移方程是填表法,我们试着改成刷表法看看-- 发现好像没啥用. 注意到游戏 ...

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

    http://uoj.ac/problem/272 这题的式子形式是异或卷积的三进制推广,因此可以设计一个类似fwt的变换,这里需要一个三次单位根$w$,满足$w^3\%p==1$且$(1+w+w^2 ...

  4. [uoj272]石家庄的工人阶级队伍比较坚强

    假设$x,y\in \{0,1,2\}$,则$x$能赢$y$(根据题中定义)当且仅当$x-y\equiv 1(mod\ 3)$ 定义$\ominus$为两数3进制下不退位的减法,$S_{x}$表示$x ...

  5. uoj#276. 【清华集训2016】汽水(分数规划+点分治)

    传送门 没想到点分治那一层-- 首先不难发现这是个分数规划,先把所有的边长减去\(k\),二分答案,设为\(mid\),就是要求路径平均值\(ans\in[-mid,mid]\) 先来考虑\(ans\ ...

  6. 【UOJ276】【清华集训2016】汽水(分数规划+点分治)

    点此看题面 大致题意: 给你一棵树,要求你选择一条树上路径,使得这条路径上边权的平均值与定值\(k\)的差的绝对值最小.求出这个最小值. 分数规划 看到平均值,首先就应该想到分数规划吧. 我们二分答案 ...

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

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

  8. UOJ_274_[清华集训2016]温暖会指引我们前行_LCT

    UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...

  9. UOJ 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

随机推荐

  1. centos安装RabbitMQ 3.7.9 (使用RPM)

    上篇我们提到不使用RPM安装RabbitMQ 3.7.8,其实我个人更倾向不使用RPM安装RabbitMQ,因为可以控制安装位置及设置参数. 存在即合理,使用RPM安装RabbitMQ,可以减少配置参 ...

  2. Quartz-Spring定时任务器持久化,通过Service动态添加,删除,启动暂停任务

    原文地址:https://blog.csdn.net/ljqwstc/article/details/78257091 首先添加maven的依赖: <!--quartz定时任务--> &l ...

  3. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  4. PHP实用代码片段(三)

    1. 目录清单 使用下面的 PHP 代码片段可以在一个目录中列出所有文件和文件夹. function list_files($dir) { if(is_dir($dir)) { if($handle ...

  5. PS调出唯美冷色情侣婚纱写真照

    一.打开PS原片,原片是一张JPG格式的片子 色温较高整个画面较红离对着上面的我们标准的韩式色调我们来进行调节吧 ,我就不打太多文字解释一些基本常规了 二.韩式婚纱内景喜欢加点烟雾.其实我本人是不太喜 ...

  6. apache benchmark 的简单安装与测试

    1. 下载apache benchmark Copy From https://blog.csdn.net/fyqaccpt96/article/details/43272001 yum instal ...

  7. mvn clean deploy

    如果是 mthrift的话,需要部署,就用 mvn clean deploy; 先进入  cd qcs.appeal.client ,然后执行:mvn clean deploy;

  8. MyBatis基础:MyBatis数据基本操作(2)

    1. MyBatis映射器 2. MyBatis数据基本操作 示例项目结构: <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...

  9. SSM框架整合系列——第一步

    环境: JDK8 idea2018.2 maven3.5 spring和springMVC是天然集成,所以只需要解决mybatis和spring的整合问题,重点整合mybatis和spring的两个东 ...

  10. Delphi数据集与记录

    1.1Delphi数据库应用程序的层次结构 Delphi数据库应用程序通过数据存取构件对数据库进行访问,通过可视的数据构件(Data Control)将数据呈现给用户,并与用户进行交互.Delphi数 ...