第九集,结束亦是开始

题意:

大致意思就是给你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 ;
}

最新文章

  1. SQLServer如何添加try catch
  2. java json数据的处理
  3. CocoaPod升级(以及ERROR: While executing gem ... (Errno::EPERM)解决办法)
  4. Light Pre-Pass相关链接
  5. JavaScipt 源码解析 css选择器
  6. 常用分类列表wp_list_categories()
  7. NYOJ-102 次方求模 AC 分类: NYOJ 2014-02-06 18:53 184人阅读 评论(0) 收藏
  8. Understanding Design And Development Job Titles--reference
  9. 【47】请使用traits classes表现类型信息
  10. 等待事件--db file sequential read
  11. POJ 2553 The Bottom of a Graph (强连通分量)
  12. Linux入门(11)——Ubuntu16.04安装texlive2016并配置texmaker和sublime text3
  13. &quot;C#&quot;:MySql批量数量导入
  14. stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h文件作用
  15. 【SVN】SVN初识
  16. HIkari线程池调优
  17. URI,url简介
  18. Mysql数据库单表查询
  19. oracle查找重复记录-转
  20. Mysql初级第一天(wangyun)

热门文章

  1. redis 持久化 RDB
  2. docker基础知识普及(一)
  3. 浅析SPDY
  4. 解决Vue在IE中报错出现不支持=&gt;等ES6语法和“Promise”未定义等问题
  5. 快速查找 js 插件
  6. JDBC——DBHelper代码模版
  7. c# 匿名类型获取值
  8. android开发过程报错
  9. python 类中__int__和__str__的使用
  10. gcc posix sjij for MSYS 9.2.1+