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;
}

  

时间: 2024-10-05 20:31:20

BZOJ2498 : Xavier is Learning to Count的相关文章

【FFT】 UVALIVE 5705 Xavier is Learning to Count

通道:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3706

Introduction to SQL

目录 SELECTING SELECTing single columns SELECTing multiple columns select all SELECT DISTINCT Learning to COUNT FILTERING WHERE Simple filtering of text WHERE AND WHERE AND OR BETWEEN SELECTING SELECTing single columns 格式: select xx from xx SELECT不区分大小

nodejs api 中文文档

文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格式 目录 关于本文档 稳定度 JSON 输出 概述 全局对象 global process console 类: Buffer require() require.resolve() require.cache require.extensions __filename __dirname module e

Learning Spark——使用spark-shell运行Word Count

在hadoop.zookeeper.hbase.spark集群环境搭建中已经把环境搭建好了,工欲善其事必先利其器,现在器已经有了,接下来就要开搞了,先从spark-shell开始揭开Spark的神器面纱. spark-shell是Spark的命令行界面,我们可以在上面直接敲一些命令,就像windows的cmd一样,进入Spark安装目录,执行以下命令打开spark-shell: bin/spark-shell --master spark://hxf:7077 --executor-memory

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 Spark MLlib Deep Learning工具箱,是根据现有深度学习教程<UFLDL教程>中的算法,在SparkMLlib中的实现.具体Spark MLlib Deep Learning(深度学习)目录结构: 第一章Neural Net(NN) 1.源码 2.源码解析 3.实例 第二章D

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 2基础及源码解析 2.1 Convolution Neural Network卷积神经网络基础知识 1)基础知识: 自行google,百度,基础方面的非常多,随便看看就可以,只是很多没有把细节说得清楚和明白: 能把细节说清

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.3

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.3 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 3实例 3.1 测试数据 按照上例数据,或者新建图片识别数据. 3.2 CNN实例 //2 测试数据 Logger.getRootLogger.setLevel(Level.WARN) valdata_path="/use

[kaggle入门] Titanic Machine Learning from Disaster

Titanic Data Science Solutions¶ https://www.kaggle.com/startupsci/titanic-data-science-solutions 数据挖掘竞赛七个步骤:¶ Question or problem definition. Acquire training and testing data. Wrangle, prepare, cleanse the data. Analyze, identify patterns, and explo

(转) Deep Learning in a Nutshell: Reinforcement Learning

Deep Learning in a Nutshell: Reinforcement Learning Share: Posted on September 8, 2016by Tim Dettmers No CommentsTagged Deep Learning, Deep Neural Networks, Machine Learning,Reinforcement Learning This post is Part 4 of the Deep Learning in a Nutshel