COGS 2581 无聊的会议V2
题目大意
给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对于每个位置\(i\)求使\(i\)成为中心轴的三元对的数量.
题解
首先我们发现\((a_i \leq 5)\)所以我们可以分别枚举0~5这6个数字
假设当前枚举到\(num\),那么把等于\(num\)的置为1,其余的置为0
那么现在问题转化成了怎么求出值全为1的三元对
观察下图:假设方框所选作为中心轴

则中心轴的数量+1当且仅当黑线的两端均为1
我们发现若黑线表示两数相乘,那么乘法运算恰好符合上一句
并且我们发现这构成了卷积的形式
所以我们使用FFT加速
由数学知识可以得到,以i为中心轴的三元对个数储存于\(2i\)中
但是因为我们计算时没有保证\(x < z\)所以不要忘了\(ans/=2\)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 1048576+1+11424;
const int mod = 23068673;
const int pri_rt = 3;
int e[maxn],ie[maxn],len;
inline int qpow(int x,int p){
int ret = 1;
for(;p;x=1LL*x*x%mod,p>>=1) if(p&1) ret=1LL*ret*x%mod;
return ret;
}
inline void init(int n){
len = n;
int bas = qpow(pri_rt,(mod-1)/len);
int inv = qpow(bas,mod - 2);
e[0] = ie[0] = 1;
for(int i=1;i<n;++i){
e[i] = 1LL*e[i-1]*bas%mod;
ie[i] = 1LL*ie[i-1]*inv%mod;
}
}
inline void FNT(int n,int *x,int *w){
for(int i=0,t=0;i<n;++i){
if(i > t) swap(x[i],x[t]);
for(int j=n>>1;(t^=j) < j;j>>=1);
}
for(int m=2;m<=n;m<<=1){
int k = m>>1,t = len/m;
for(int i=0;i<n;i+=m){
for(int j=0,p=0;j<k;++j,p+=t){
int u = 1LL*x[i+j+k]*w[p]%mod;
x[i+j+k] = x[i+j] - u;
if(x[i+j+k] < 0) x[i+j+k] += mod;
x[i+j] += u;
if(x[i+j] >= mod) x[i+j] -= mod;
}
}
}
if(w == ie){
int inv = qpow(n,mod-2);
for(int i=0;i<n;++i) x[i] = 1LL*x[i]*inv%mod;
}
}
int a[maxn],c[maxn],ans[maxn];
int main(){
freopen("OXO.in","r",stdin);
freopen("OXO.out","w",stdout);
int n;read(n);
for(int i=0;i<n;++i) read(a[i]);
int len;for(int i=1;(i>>2)<n;i<<=1) len = i;
init(len);
for(int num=0;num<=5;++num){
memset(c,0,sizeof c);
for(int i=0;i<n;++i) if(a[i] == num) c[i] = 1;
FNT(len,c,e);
for(int i=0;i<len;++i) c[i] = 1LL*c[i]*c[i]%mod;
FNT(len,c,ie);
for(int i=0;i<len;++i){
if( (i&1) || a[i>>1] != num ) continue;
if(c[i] < 0) c[i] += mod;
ans[i>>1] += c[i]>>1;
}
}
for(int i=0;i<n;++i) printf("%d\n",ans[i]);
getchar();getchar();
return 0;
}
COGS 2581 无聊的会议V2的更多相关文章
- (转)我看PhD by 王珢
我看PhD by 王垠 前段时间看了一下这些关于 PhD 的负面信息: 一个专门反对读 PhD 的 BLOG 叫“100 Reasons NOT to Go to Graduate School”(下 ...
- Tank游戏需求分析兼项目计划发布!
项目计划 1. 编写目的 此需求文档旨在明确本游戏项目的详细规则和操作方法,供用户理解项目实现的具体功能,并作为项目详细设计开发的基础. 2. 项目背景 市面上游许多魔性小游戏,让广大玩家根本 ...
- 转载:简化IT程序员工作生活的4个窍门
如果可以简化你的生活——少做枯燥的任务,将时间真正地用于完成事情,你愿不愿意去尝试?下面就让我一起来学一下如何让程序员工作生活变得简单的小窍门.如果你敢于倾听自己的心声,你会发现自己一天中的大多数时间 ...
- 10.18 noip模拟试题
分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...
- 大V云集!参加首届阿里巴巴在线技术峰会的八大理由
由阿里巴巴集团.阿里巴巴技术协会(ATA)和阿里云云栖社区联合举办的首届阿里巴巴在线技术峰会(Alibaba Online Technology Summit)将于7月19日-21日20:00-21: ...
- 2014-10-24 NOIP欢乐赛
10-24NOIP欢乐赛 ——By 潘智力 题目名称 分火腿 无聊的会议 班服 时间限制 1s 1s 1s 内存限制 64MB 128MB 128MB 输入文件 hdogs.in meeting.in ...
- 5G VS WiFi6,实力大比拼!
移动通信与WiFi,就像移动设备上的两大高手.彼此势均力敌:一个主室内,一个主室外.WiFi是移动网络的室内覆盖补充,也承担着大量的数据流量卸载,二者既想各自占山为王,但也时不时地相互成全对方. 然而 ...
- [书籍分享]0-001.rework(重来:更为简单有效的商业思维)
封面 内容简介 大多数的企业管理的书籍都会告诉你:制定商业计划.分析竞争形势.寻找投资人等等.如果你要找的是那样的书,那么把这本书放回书架吧. 这本书呈现的是一种更好.更简单的经商成功之道.读完 ...
- 如何搭建自己的SPRING INITIALIZR server
这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...
随机推荐
- Flume-1-7-0用户手册
介绍 概述 Apache Flume是为有效收集聚合和移动大量来自不同源到中心数据存储而设计的可分布,可靠的,可用的系统. Apache Flume的用途不仅限于日志数据聚合.由于数据源是可定制的,F ...
- HDFS中数据节点数据块存储示例
数据块在数据节点上是按照如下方式存储的. 首先是一个存储的根目录/Hadoop/data/dfs/dn,如下图所示: 接着进入current目录,如下图所示: 再进入后续的BP-433072574-1 ...
- Cesium--气泡弹窗
参考资料 首先感谢以下博主们的帮助,本人刚接触Cesium不久,无奈只能拾人牙慧了. 由于cesium没有自带的点击弹出气泡的功能,所以需要自己去开发一个这样的功能,网络上资源很多,看到基本思路都一致 ...
- ssh无密码登陆屌丝指南
[0]写在前面 由于ssh 实现的是免密码登陆,大致步骤是: 0.1) client通过ssh登陆到server: 0.2) server检查家目录下的.ssh文件, 并发送公钥文件 authoriz ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...
- MongoDB学习笔记<六>
继续mongoDB的学习 --索引具体解释 --索引管理 --空间索引 1.创建简单索引 (1)先准备20万条数据 for(var i = 0;i< 200000;i++){ db.books. ...
- python 基础 8.4 re的 spilt() findall() finditer() 方法
#/usr/bin/python #coding=utf-8 #@Time :2017/11/18 18:24 #@Auther :liuzhenchuan #@File :re的spli ...
- tps 与 事务平均响应时间关系对答(转)
问者:每秒处理的事务数和事务的平均响应时间 怎么个关系,有关系吗 kaku21:举个例子:一个高速路 有10个入口,每个入口每秒钟只能进1辆车,请问1秒钟最多能进几辆车?? 问者:10 kaku21: ...
- 总是想把Linux服务器上的重要文件备份到本地,在此转一篇实现windows和linux互传文件的文章
尝试从windows xp向ubuntu11.10传文件 ubuntu使用的是ssh windows使用的是putty和其附带的pscp 首先配置ubuntu: 1.先使用netstat -tl或se ...
- EasyPlayer RTSP Windows播放器D3D,GDI的几种渲染方式的选择区别
EasyPlayer-RTSP windows播放器支持D3D和GDI两种渲染方式,其中D3D支持格式如下: DISPLAY_FORMAT_YV12 DISPLAY_FORMAT_YUY2 DISPL ...