第九集,结束亦是开始

题意:

大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m)

思路:

这个是一个防ak题,做法是要手推公式的fwt

大概就这个意思

把n个数字标记到大小为3^m的数组里

然后一个简单的方法就是,假设a是标记数组

for i=0 i<3^m i++

for j=0 j<3^m j++

ans[dis(a[i],a[j])]+=a[i]*a[j]

可能i==j的时候被算重复了,大概特判减去一下n就行了

我们发现,如果dis(a[i],a[j])是位运算就好了,这样就直接拍个fwt就行了

然后我们注意到dis(a[i],a[j])其实可以看成是一个三进制的位运算,这时候我们要推一下公式

我们定义一下位运算法则假设符号为*,则i*j=abs(i-j),且i,j∈[0,2]

给出我当时推导的过程:

a=0+2

b=0-2

c=1

d=0+1+2

C0=(a*a+b*b)/2+c*c

C1=d*d-C0-C2

C2=(a*a-b*b)/2

大概就是把一个长度为n的多项式乘法变成了4个长度为n/3的多项式乘法

0,1,2是卷积前,最高位三进制为0,1,2的三个长度为n/3的多项式

然后我们构造a,b,c,d四个长度为n/3的多项式

C0,C1,C2是卷积后的多项式

这时候我们只需要计算a*a,b*b,c*c,d*d就行了!

至于怎么构造出来a,b,c,d的,可能就看感觉了吧。。。。。。

然后分析一下复杂度

然后就看出来这是一个公比为4/3的等比数列,求和一下就知道T(m)=4^m-3^m

时间复杂度为O(m)=4^m

代码实现

#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = ;
ll pool[/+],*p=pool;
ll ans[];
ll A[maxn];
/*
a=0+2
b=0-2
c=1
d=0+1+2
C0=(a*a+b*b)/2+c*c
C1=d*d-C0-C2
C2=(a*a-b*b)/2
*/
void fwt(ll *A,int len){
if(len==){
A[]=A[]*A[];
return ;
}
int nlen=len/;
ll *a=p;
p+=nlen;
ll *b=A;
ll *c=A+nlen;
ll *d=A+nlen*;
for(int i=;i<nlen;i++){
ll x=A[i],y=A[i+nlen],z=A[i+*nlen];
a[i]=x+z;
b[i]=x-z;
c[i]=y;
d[i]=x+y+z;
}
fwt(a,nlen);fwt(b,nlen);
fwt(c,nlen);fwt(d,nlen);
for(int i=;i<nlen;i++){
ll x=a[i],y=b[i],z=c[i],w=d[i];
A[i]=(x+y)/+z;
A[i+nlen*]=(x-y)/;
A[i+nlen]=w-A[i+nlen*]-A[i];
}
} int cal(int x){
int res=;
while(x){
res+=x%;
x/=;
}
return res;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
A[x]++;
}
int len=;
for(int i=;i<=m;i++)
len*=;
fwt(A,len);
for(int i=;i<len;i++)
ans[cal(i)]+=A[i];
ans[]-=n;
for(int i=;i<=m*;i++){
if(i)putchar(' ');
printf("%lld",ans[i]);
}puts("");
return ;
}

福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt的更多相关文章

  1. 福建工程学院第十四届ACM校赛J题题解

    第六集,想不到你这个浓眉大眼的都叛变革命了 题意: 给你两个只包含01的字符串S和T,问你在允许一次错误的情况下,T是否能成为S的子串 思路: 这个问题的解法挺多,我是用fft匹配的,也比较简单,针对 ...

  2. 福建工程学院第十四届ACM校赛G题题解

    外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...

  3. 福建工程学院第十四届ACM校赛B题题解

    第二集,未来的我发量这么捉急的吗 题意: 有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1) ...

  4. 福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记

    http://www.fjutacm.com/Contest.jsp?cid=705#P4 其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数.但是发现直接暴力一波就 ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. 湖南大学第十四届ACM程序设计新生杯(重现赛)G a+b+c+d=? (16进制与LL范围)

    链接:https://ac.nowcoder.com/acm/contest/338/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K6 ...

  7. 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)

    链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...

  8. 湖南大学第十四届ACM程序设计新生杯(重现赛)

    RANK  0 题数 0 期末复习没有参加,补几道喜欢的题. A: AFei Loves Magic  签到 思路 :不需考虑 碰撞 直接计算最终状态即可. #include<bits/stdc ...

  9. 湖南大学第十四届ACM程序设计新生杯 E.Easy Problem

    E.Easy Problem Description: Zghh likes number, but he doesn't like writing problem description. So h ...

随机推荐

  1. HDU 5791 Two ——(LCS变形)

    感觉就是最长公共子序列的一个变形(虽然我也没做过LCS啦= =). 转移方程见代码吧.这里有一个要说的地方,如果a[i] == a[j]的时候,为什么不需要像不等于的时候那样减去一个dp[i-1][j ...

  2. Tree-based Model 如何处理categorical variable

    categorical variable 分为 order variale 和 non-order variable,其中order variable直接使用sklearn.preprocess.La ...

  3. IDEA安装配置Thrift

    下载exe:http://archive.apache.org/dist/thrift/0.9.3/ 新建一个thrift目录放进来,并将名字改成thrift

  4. Linux常用文本处理命令

    1.grep命令 echo 'zero\nzo\nzoo' | grep 'z.*o':将匹配以'z'开头以'o'结尾的所有字符串 echo 'zero\nzo\nzoo' | grep 'z.o': ...

  5. flask第三篇 request

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  6. python3笔记目录大纲汇总

    篇一.python3基础知识和语句 python3笔记一:python基础知识 python3笔记二:进制转换与原码反码补码 python3笔记三:运算符与表达式 python3笔记四:if语句 py ...

  7. IDEA问题java: -source 1.6 中不支持diamond、 lambda 表达式

    文章目录 一.问题:连片的java: -source 1.6 中不支持 diamond 运算符.lambda 表达式 二.解决方法: 1.在微信群里问大佬,大佬在玩游戏,回复的比较慢 2.自己查Goo ...

  8. Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference

    指针基础知识package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p ...

  9. WPF/ASP.NET:几个Prism中的术语

    Prism 棱镜 Bootstrapper 启动器 dependency injection 依赖注入 regions 区域 navigation 导航 shell  壳

  10. Mysql(一)、索引研究

    一.索引简介 1. 为什么要使用索引 查询高效 2. 什么样的信息能成为索引 主键,唯一键,普通键等 二.优化你的索引 1. 二叉查找树 二叉查找树,也称二叉搜索树,或二叉排序树.其定义也比较简单,要 ...