BZOJ2498 : Xavier is Learning to Count
考虑容斥,通过$Bell(p)$的时间枚举所有等价情况。
对于一种情况,强制了一个等价类里面的数都要相同,其它的可以相同也可以不同。
这方案数显然可以通过多项式乘法求得,乘上容斥系数$(-1)^{p-等价类个数}\ \ \ \ \ \ \ \times(每个等价类大小-1)!之积$。
可以先把那$p$个多项式DFT,然后在点值表示下计算答案,最后再IDFT回来即可。
时间复杂度$O(pn(\log n+Bell(p)))$。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long double ld;
const int N=65540;
const ld pi=acos(-1.0);
int T,C,_,P,n,m,a[N],i,j,pos[N],w[6];
struct comp{
ld r,i;
comp(ld _r=0,ld _i=0){r=_r,i=_i;}
comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
}f[6][N],g[N];
inline void FFT(comp*a,int n,int t){
for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
for(int d=0;(1<<d)<n;d++){
int m=1<<d,m2=m<<1;
ld o=pi*2/m2*t;comp _w(cos(o),sin(o));
for(int i=0;i<n;i+=m2){
comp w(1,0);
for(int j=0;j<m;j++){
comp&A=a[i+j+m],&B=a[i+j],t=w*A;
A=B-t;B=B+t;w=w*_w;
}
}
}
if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
void dfs(int x,int y){
if(x==P){
int i,j,k=(P-y)&1?-1:1;
for(i=1;i<=y;i++)for(j=2;j<w[i];j++)k*=j;
comp t(k,0);
for(j=0;j<m;j++)g[j]=f[w[1]][j];
for(i=2;i<=y;i++)for(j=0;j<m;j++)g[j]=g[j]*f[w[i]][j];
for(j=0;j<m;j++)f[0][j]=f[0][j]+g[j]*t;
return;
}
for(int i=1;i<=y+1;i++){
w[i]++;
dfs(x+1,max(i,y));
w[i]--;
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&_,&P);
for(n=i=0;i<_;i++){
scanf("%d",&a[i]);
if(a[i]>n)n=a[i];
}
n*=P;
for(m=1;m<=n;m<<=1);
j=__builtin_ctz(m)-1;
for(i=0;i<m;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
for(i=0;i<=P;i++)for(j=0;j<m;j++)f[i][j]=comp(0,0);
for(i=0;i<_;i++)for(j=1;j<=P;j++)f[j][j*a[i]].r+=1;
for(i=1;i<=P;i++)FFT(f[i],m,1);
dfs(0,0);
FFT(f[0],m,-1);
for(j=i=1;i<=P;i++)j*=i;
printf("Case #%d:\n",++C);
for(i=1;i<m;i++){
ld ans=f[0][i].r/j;
if(ans>0.5)printf("%d: %.0f\n",i,(double)ans);
}
puts("");
}
return 0;
}
BZOJ2498 : Xavier is Learning to Count的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Self-Supervised Representation Learning
Self-Supervised Representation Learning 2019-11-11 21:12:14 This blog is copied from: https://lilia ...
- 基于CNN的人群密度图估计方法简述
人群计数的方法分为传统的视频和图像人群计数算法以及基于深度学习的人群计数算法,深度学习方法由于能够方便高效地提取高层特征而获得优越的性能是传统方法无法比拟的.本文简单了秒速了近几年,基于单张图像利用C ...
- ICCV 2017论文分析(文本分析)标题词频分析 这算不算大数据 第一步:数据清洗(删除作者和无用的页码)
IEEE International Conference on Computer Vision, ICCV 2017, Venice, Italy, October 22-29, 2017. IEE ...
- Introduction to SQL
目录 SELECTING SELECTing single columns SELECTing multiple columns select all SELECT DISTINCT Learning ...
- nodejs api 中文文档
文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...
- Programming Learning - Based on Project
Today when taking a bath I got a good idea that it is an efficient and interesting way to learn a ne ...
- 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令
<Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...
- 【深度学习Deep Learning】资料大全
最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books by Yoshua Bengio, Ian Goodfellow and Aaron C ...
随机推荐
- 微信小程序技术分析:Mustache语法要点总结
小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究下. 什么是Mustache?Mustache是一个logic-less(轻逻辑)模板解析引擎,它是为了使用户 ...
- java 写文本换行
import org.apache.commons.io.FileUtils; public static void main(String[] args) throws IOException { ...
- Macbook 的 print screen 是什么
- win10 安装framework3.5
win+x 点击命令提示符(个管理员) 输入dism.exe /online /enable-feature /featurename:NetFX3 /Source:H:\sources\sxs(解压 ...
- go:关于变量地址的疑惑
定义一些变量,并输出其地址 一.一般变量 var a, b int32 var c, d int64 输出其地址 结果: a 0xc082006310 b 0xc082006320 c 0xc0820 ...
- 别老嫌Mac系统难用 这些快捷键你都用过吗
苹果今年10月发布的全新带把儿(bar)的MacBook,轻薄炫酷的外观大受欢迎,其中当然不乏很多从Windows转到Mac阵营的用户.不少习惯了Windows操作习惯的用户在上手Mac时都会觉得非常 ...
- 【svn】SSL error: A TLS warning alert has been received的解决方法
第一次用svn(>_<),结果在运行下面语句时,svn很不友好的报错了..... svn co http:10.11.12.13/test1/test2 . 报错信息: svn: OPTI ...
- STM32F412应用开发笔记之四:与远红外炭氢传感器通讯
远红外炭氢传感器是在多组分气体传感器中用来检测甲烷和丙烷浓度的,采用单总线串行通讯,TTL电平.所以我们需要用到UART口来实现与远红外炭氢传感器的通讯. 远红外传感器就是这个样子的: 再来一张进气和 ...
- react开发环境搭建
---恢复内容开始--- 要想用react,需要安装: 1)babel-sublime: 作用:编译es6,支持ES6, React.js, jsx代码高亮,并对所编译的代码进行高亮显示. 安装步骤: ...
- jQuery- 表单验证插件-Validation
▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法, ...