福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt
第九集,结束亦是开始
题意:
大致意思就是给你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的更多相关文章
- 福建工程学院第十四届ACM校赛J题题解
第六集,想不到你这个浓眉大眼的都叛变革命了 题意: 给你两个只包含01的字符串S和T,问你在允许一次错误的情况下,T是否能成为S的子串 思路: 这个问题的解法挺多,我是用fft匹配的,也比较简单,针对 ...
- 福建工程学院第十四届ACM校赛G题题解
外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...
- 福建工程学院第十四届ACM校赛B题题解
第二集,未来的我发量这么捉急的吗 题意: 有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1) ...
- 福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记
http://www.fjutacm.com/Contest.jsp?cid=705#P4 其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数.但是发现直接暴力一波就 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)G a+b+c+d=? (16进制与LL范围)
链接:https://ac.nowcoder.com/acm/contest/338/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K6 ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)I:II play with GG(博弈论||DP)
链接:https://ac.nowcoder.com/acm/contest/338/I 来源:牛客网 题目描述 IG won the S championship and many people a ...
- 湖南大学第十四届ACM程序设计新生杯(重现赛)
RANK 0 题数 0 期末复习没有参加,补几道喜欢的题. A: AFei Loves Magic 签到 思路 :不需考虑 碰撞 直接计算最终状态即可. #include<bits/stdc ...
- 湖南大学第十四届ACM程序设计新生杯 E.Easy Problem
E.Easy Problem Description: Zghh likes number, but he doesn't like writing problem description. So h ...
随机推荐
- python进程间的通信
from multiprocessing import Queue, Process import time, random # 要写入的数据 list1 = ["java", & ...
- centos调整屏幕亮度
笔记本安装centos6.5后亮度无法通过键盘快捷键调节,可以通过安装软件来调节. 安装:yum install xgamma 设置亮度:xgamma -gamma n( 0.1 < n < ...
- C++入门经典-友元
1:在讲述类的内容时说明了隐藏数据成员的好处,但是有时类会允许一些特殊的函数直接读写其私有数据成员. 使用friend关键字可以使特定的函数或者别的类的所有成员函数对私有数据成员进行读写.这既可以保持 ...
- linux系统空间不足,lsof看到异常的delete状态的文件。
#20191101更新---这篇文章适用于产生僵尸文件的进程是可kill的状态参考,就是这个进程死亡不影响业务,那么另外一种情况,也是我现在管理的项目中生产环境中出现过的情况,产生僵尸文件的进程是we ...
- mysql 查看库结构---查看表结构
查看库结构:SHOW DATABASES; 查看表结构: show tables即为显示当前数据库中所有的表.又如: mysql> use dbname //进入dbname库Database ...
- 6.HBase时髦谨慎财会会计
1.基本概念和原理 2.核心知识点 3.安装部署 4.Hbase开发
- 二、WebSphere Application Server上部署war包并访问
进入我们was服务器控制台之后我们直接按照下图操作: 2.选择要上传的war包,下一步 3.一直下一步,步骤4注意填好“上下文根”,然后继续下一步,直到完成. 4.点击保存到主配置 5.应用程序> ...
- stm8问题记录
sprintf 错误 现象:打印不出来数字 需要包含#include<stdio.h>
- Maven 默认 SpringMVC-servlet.xml 基本配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- flask 学习(四)
最近在学“数据库配置”这一部分,试着运行示例5-1的程序时解释器提示出错: $\venv\lib\site-packages\flask_sqlalchemy\__init__.py:800: U s ...