BZOJ3771 - Triple

2024-03-19 17:58
文章标签 triple bzoj3771

本文主要是介绍BZOJ3771 - Triple,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Portal

Description

给出\(n\)个互不相同的数\(\{a_n\}(a_i\leq4\times10^4)\),从中选出一至三个数,其和为\(sum\)。求对于所有可能的\(sum\)各有多少种方案。

Solution

生成函数+容斥原理+FFT。
定义\(A(x)\)为仅选取一个数的生成函数,即\(A(a_i)=1\)\(B(x)\)为仅选取两个相同数的生成函数,即\(B(2a_i)=1\)\(C(x)\)为仅选取三个相同数的生成函数,即\(C(3a_i)=1\)

仅选取一个数的生成函数为\(A\)
仅选取两个数的生成函数为\((A*A-B)/2\)
仅选取三个数的生成函数为\((A*A*A-3A*B+2C)/6\)

依容斥原理简单解释一下。选取两个数:等价于随便选两个数\(x_1,x_2\)\(A*A\)),减去\(x_1=x_2\)\(B\)),因为选择有顺序所以除以\(2!\)。选取三个数:等价于随便选三个数\(x_1,x_2,x_3\)\(A*A*A\)),减去\(x_1=x_2\)\(x_2=x_3\)\(x_3=x_1\)\(3A*B\)),加上两倍(因为被减三次)\(x_1=x_2=x_3\),再除以\(3!\)
求卷积的话用FFT就好。

\(n_0=3max\{a\}\),时间复杂度为\(O(n_0logn_0)\)

Code

//Triple
#include <complex>
#include <cstdio>
typedef long long lint;
typedef std::complex<double> cpx;
const int N=15e4;
const double PI=acos(-1);
int n;
int n0,t,pos[N];
cpx a[N],b[N],c[N],ans[N];
int max(int x,int y) {return x>y?x:y;}
void FFT(cpx x[],int f)
{for(int i=0;i<n0;i++) if(i<pos[i]) swap(x[i],x[pos[i]]);for(int i=1;i<n0;i<<=1){cpx Wn=cpx(cos(PI/i),f*sin(PI/i));for(int j=0;j<n0;j+=i<<1){cpx w=1;for(int k=0;k<i;k++,w*=Wn){cpx p=x[j+k],q=w*x[j+k+i];x[j+k]=p+q,x[j+k+i]=p-q;}}}if(f==-1) for(int i=0;i<n0;i++) x[i]/=n0;
}
int main()
{scanf("%d",&n); int m=0;for(int i=1;i<=n;i++){int x; scanf("%d",&x);m=max(m,x);a[x]=b[x+x]=c[x+x+x]=1;}n0=1,t=0; while(n0<m+m+m) n0<<=1,t++;for(int i=0;i<n0;i++) pos[i]=pos[i>>1]>>1|(i&1)<<t-1;FFT(a,1),FFT(b,1),FFT(c,1);for(int i=0;i<n0;i++){ans[i]=a[i];ans[i]+=(a[i]*a[i]-b[i])/2.0;ans[i]+=(a[i]*a[i]*a[i]-3.0*a[i]*b[i]+2.0*c[i])/6.0;}FFT(ans,-1);for(int i=0;i<n0;i++){lint x=(lint)(ans[i].real()+0.5);if(x) printf("%d %lld\n",i,x);}return 0;
}

转载于:https://www.cnblogs.com/VisJiao/p/BZOJ3771.html

这篇关于BZOJ3771 - Triple的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826810

相关文章

【SPOJ】Triple Sums【FFT】

传送门:【SPOJ】Triple Sums 题目分析: 首先我们不考虑 i<j<k i<j<k这个条件,构造多项式: Y=∑xai \qquad\qquad\qquad Y = \sum x^{a_i} 那么 ai+aj+ak=S ai+aj+ak=S的个数即 xai+aj+ak=S x^{a_i+a_j+a_k=S}的个数,等价于 Y3中xS Y^3中x^S的系数。 然后我们考虑容斥

triple Des加密之ECB加密解密、CBC加密解密

//注意偏移量 package sss; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto

假暴力,cf1168B. Good Triple

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1168B - Codeforces 二、解题报告 1、思路分析 一眼没思路,打个暴力试试 因为如果 s[l, r] 是一个好字符串,那么s[i, r]一定也是好字符串,其中i < l 那么我们枚举左端点l,找到最近的r,那么l的贡献就是n -

Pair和Triple的最佳实践

在软件开发中,数据结构是至关重要的概念。它们帮助我们以高效和有组织的方式存储和处理数据。在Java语言中,Pair(对)和Triple(三元组)是两个常见的数据结构,它们在不同的场景中都有广泛的应用。本文将详细介绍这两个数据结构的定义、用途、以及它们在Java中的具体应用,旨在帮助读者清晰理解这两个概念并解决可能面临的困惑。 一、Pair的定义与用途 1.1 定义 在计算机科学中,Pair是

利用Triple U.Net结构对冷冻切片HE染色组织学图像进行核实例分割

利用Triple U.Net结构对冷冻切片H&E染色组织学图像进行核实例分割 摘要IntroductionRelated WorksDatasetProposed MethodologyDataset PreparationSegmentation BranchLoss FunctionWatershed Algorithm Nuclei Instance Segmentation

Android性能:Double Buffer双缓冲/Triple Buffer三缓冲丢帧Jank与无丢帧No Jank

Android性能:Double Buffer双缓冲/Triple Buffer三缓冲丢帧Jank与无丢帧No Jank   双缓冲丢帧与无丢帧:     App 连续两帧生产都超过 Vsync 周期,错过 SurfaceFlinger 合成时机),出现掉帧: 与之对应的trace: 三Buffer轮转情况下,基本不会有这种情况的发生,渲染线程一般在 dequeueB

Broadband Network Architectures: Designing and Deploying Triple-Play Services

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp *An in-depth introduction to next-generation triple-play services: components, integration, and business

Triple HDU - 5517 —— 二维树状数组

Given the finite multi-set A of n pairs of integers, an another finite multi-set B of m triples of integers, we define the product of A and B as a multi-set C=A∗B={⟨a,c,d⟩∣⟨a,b⟩∈A, ⟨c,d,e⟩∈B and b=e}

Spoj 8372 Triple Sums

传送门:http://www.spoj.com/problems/TSUM/ 思路:先不管i<j<k这个条件 构造一个多项式A(x)=sigma x^a[i] 那么S=a[i]+a[j]+a[k]的个数就是x^(a[i]+a[j]+a[k]=S)的个数 为了让指数相加,我们把A(x)进行立方 那么个数就是A(x)^3中S次项的系数 然后进行容斥,为了方便,以下省去指数a[i]

3771: Triple

考虑三个多项式 a b c a b c a \ b \ c 令 a a a 表示选取一个相同的方案数 令 b b b 表示选取两个相同的方案数 令 c c c 表示选取三个相同的方案数 取一个的方案数即 a a a 取两个的方案数即 a2−b2 a 2 − b 2 \frac{a^2-b}{2} 考虑实际上 a2−b a 2 − b