Wannafly Winter Camp 2019.Day 8 div1 I.岸边露伴的人生经验(FWT)
\(Description\)
给定\(n\)个十维向量\(\overrightarrow{V_i}=x_1,x_2,...,x_{10}\)。定义\(\overrightarrow{V}=x_1,x_2,...,x_{10}\)的模长\(|\overrightarrow{V}|=\sqrt{x_1^2+x_2^2+...+x_{10}^2}\)。求有多少个四元组\(1\leq i,j,k,l\leq n\)满足\(|\overrightarrow{V_i}-\overrightarrow{V_j}|=|\overrightarrow{V_k}-\overrightarrow{V_l}|\)。
\(n\leq10^5,\ 0\leq x_i\leq2\)。
\(Solution\)
考虑\(x\in[0,2]\)的话如何转化\((x_i-x_j)^2\)。将每个向量用一个\(20\)位二进制数\(a\)表示,即\(x_i=0\),则\(a\)的第\(2i-1\)和\(2i\)位为\(00\);\(x_i=1\),第\(2i-1\)和\(2i\)位为\(01\);\(x_i=2\),第\(2i-1\)和\(2i\)位为\(10\)。
这样当\(x_i-x_j\)不同时,对应唯一的\(a_i\ \mathbb{xor}\ a_j\)的结果。所以我们计算\(a_i\ \mathbb{xor}\ a_j\)就能知道差的模长\(|\overrightarrow{V_i}-\overrightarrow{V_j}|\)了。
用\(FWT\)计算\(a_i\ \mathbb{xor}\ a_j=b\)的\((i,j)\)有多少个,再把\(b\)转为模长,就行了。模长最大值是\(40\)。
复杂度\(O(20\times2^{20})\)。
//167ms 6MB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mod 998244353
#define inv2 499122177
#define Add(x,y) x+y>=mod?x+y-mod:x+y
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=(1<<20)+5,lim=1<<20,ref[]={0,1,4,1};
int A[N],B[50];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
void FWT(int *a,int opt)
{
for(int i=2; i<=lim; i<<=1)
for(int j=0,mid=i>>1; j<lim; j+=i)
for(int k=j; k<j+mid; ++k)
{
int x=a[k],y=a[k+mid];
a[k]=Add(x,y), a[k+mid]=Add(x,mod-y);
if(opt==-1) a[k]=1ll*a[k]*inv2%mod, a[k+mid]=1ll*a[k+mid]*inv2%mod;
}
}
int main()
{
const int n=read();
for(int i=1; i<=n; ++i)
{
int a=0;
for(int j=0; j<10; ++j)
switch(read())
{
case 0: a<<=2; break;
case 1: a<<=2, a|=1; break;//先左移再或。。
case 2: a<<=2, a|=2; break;
}
++A[a];
}
FWT(A,1);
for(int i=0; i<lim; ++i) A[i]=1ll*A[i]*A[i]%mod;
FWT(A,-1);
for(int i=0; i<lim; ++i)
{
if(!A[i]) continue;
int res=0;
for(int x=i; x; x>>=2) res+=ref[x&3];
B[res]=Add(B[res],A[i]);
}
LL ans=0;
for(int i=0; i<=40; ++i) ans+=1ll*B[i]*B[i]%mod;
printf("%lld\n",ans%mod);
return 0;
}
Wannafly Winter Camp 2019.Day 8 div1 I.岸边露伴的人生经验(FWT)的更多相关文章
- Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)
题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...
- 2019 wannafly winter camp day5-8代码库
目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sortin ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- 2019 wannafly winter camp
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- 2019 wannafly winter camp day1-4代码库
目录 day1 F div1 爬爬爬山 (最短路) B div2 吃豆豆 (dp) J div2 夺宝奇兵(暴力) J div1 夺宝奇兵 (权值线段树) C div1 拆拆拆数 E div1 流流流 ...
- Wannafly Winter Camp Day5 Div1 E题 Fast Kronecker Transform 转化为NTT或FFT
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 原题目描述在最下面. 对给定的式子算解. ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
随机推荐
- 在线版区间众数 hzw的代码。。
/* 查询区间众数,要求强制在线 设有T个块 1.众数只可能在大块[L,R]里或者两端[l,L) (R,r]里出现 2.大块的众数只要预处理打表一下即可,复杂度n*T(这样的区间有T*T个) 3.两端 ...
- jenkins持续集成:jenkins+SVN
实现jenkins从svn拉取最新的代码,再执行驱动脚本进行自动化测试 新建一个任务 输入任务名,选“构建一个自由风格的软件项目”,点左下角“确定” 丢弃旧的构建,如下设置为保留3天内的10条构建记录 ...
- ElasticSearch搜索解析
这篇介绍稍多,篇幅可能有点多,下面会针对一些重要的点做一些小测试 搜索返回文档解析 hits搜索返回的结果中最重要的一部分其中包含了 索引信息(_index,_type,_index,_source, ...
- 一脸懵逼加从入门到绝望学习hadoop之Caused by: java.net.UnknownHostException: master报错
windows下开发hadoop应用程序,hadoop部署在linux环境中, 在运行调试时可能会出现无法找到主机,类似异常信息如下: java.net.UnknownHostException: u ...
- [转] js中的事件委托或是事件代理详解
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
- Ng Alain使用 - cli和克隆两种方式
感觉没啥要写的,但是在查看相关资料的过程中发现不少浮夸的人,可以说是完全不阅读官方文档,操作完全无厘头,,创建了删,配置,再删除,,,扯蛋....., 方式一:CLI(推荐) # 确保使用的是最新版本 ...
- silverlight5 OOB 直接p/invoke实现串口通信
public class SerialWrapper : IDisposable { #region Enum public enum StopBits ...
- Centos6.5安装Apache ab性能测试工具
ab简洁: ab是apache自带的压力测试工具,ab是apachebench命令的缩写. ab不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试. ab是一个h ...
- cropper.js图片裁剪
最近做电子名片的项目,可是个人照片展示上出现了 用户上传的图片尺寸严重失调,所以要求进行图片裁剪,再此我对图片裁剪进行调研 还不太成熟 以后再改 这个实现的原理是 前台获取到 坐标 图片的尺寸 原图文 ...
- Codeforces 1101F Trucks and Cities dp (看题解)
Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...