Spoj 8372 Triple Sums

本文介绍了一种利用多项式求解特定数学问题的方法,通过构造多项式并运用容斥原理去除重复计数,解决给定序列中寻找三个元素之和的组合问题。涉及快速傅里叶变换(FFT)进行高效多项式乘法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你n个数字,对于任意s,s满足\(s=u_i+u_j+u_k,i<j<k\),要求出所有的s和对应满足条件的i,j,k的方案数

Solution:

构造一个函数:\(A(x)=\sum_{i=0}^{n-1}a_ix^i\),这是一个多项式

对于每一个\(u_i\),我们把这个多项式中的\(x^{u_i}\)的系数\(a_{u_i}\)加上一

也就是说,对于任意\(x^i\),它的系数为i在给出序列中出现的次数

多项式的三次方为:
\[ C(x)=A(x)^3\\ C(x)=\sum_{i=0}^{3n}c_ix^i\\ c_i=\sum_{0\le l,j,k\le n,l+j+k=i}a_ja_ka_l \]

在不考虑\(i<j<k\)的限制条件下,对于任意s,构成s的方案数就是\(C(x)\)\(x^s\)的系数\(c_s\)

我们再来考虑容斥去重将不符合要求的方案给去掉

考虑当\(i,j,k\)中有两个数相同时,构建多项式:\(B(x)=\sum_{i=0}^{n-1}b_ix^i\)

其中对于任意\(x^i\),它的系数\(b_i\)\(i/2(i\,mod\,2=0)\)在序列中出现的次数

则对于多项式:\(D(x)=A(x)B(x)\),它的系数就是两数相同的情况的方案数

\(C(x)\)中它被多加了三次,但减去之后,我们显然可以发现我们将\(i=j=k\)的情况多减了一次

加上后,就得到了不考虑\(i<j<k\)时,\(i\ne j\ne k\)的所有方案数,此时再考虑\(i\le j\le k\),只需把方案数除以6就行了

Code:

#include<bits/stdc++.h>
#define ll long long
#define Pi acos(-1.0)
using namespace std;
const int N=1<<17;
int n,len,tim=17,rtt[N],c[N];
struct cp{double x,y;}aa[N],bb[N],cc[N];
cp operator + (cp a,cp b){return (cp){a.x+b.x,a.y+b.y};}
cp operator - (cp a,cp b){return (cp){a.x-b.x,a.y-b.y};}
cp operator * (cp a,cp b){return (cp){a.x*b.x-a.y*b.y,a.y*b.x+a.x*b.y};}
void FFT(cp *a,int flag){
    for(int i=0;i<len;i++)
        if(i<rtt[i]) swap(a[i],a[rtt[i]]);
    for(int l=2;l<=len;l<<=1){
        cp wn=(cp){cos(flag*2*Pi/l),sin(flag*2*Pi/l)};
        for(int st=0;st<len;st+=l){
            cp w=(cp){1,0};
            for(int u=st;u<st+(l>>1);u++,w=w*wn){
                cp x=a[u],y=w*a[u+(l>>1)];
                a[u]=x+y,a[u+(l>>1)]=x-y;
            }
        }
    }
}
int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int main(){
    n=read(),len=N;
    for(int i=1;i<=n;i++){
        int x=read()+20000;
        aa[x].x=aa[x].x+1;
        bb[x<<1].x=bb[x<<1].x+1;
        c[x+x+x]++;
    }
    for(int i=0;i<len;i++)
        rtt[i]=(rtt[i>>1]>>1)|((i&1)<<(tim-1));
    FFT(aa,1);FFT(bb,1);
    for(int i=0;i<len;i++)
        cc[i]=aa[i]*(aa[i]*aa[i]-(cp){3,0}*bb[i]);
    FFT(cc,-1);
    for(int i=0;i<N;i++){
        ll cnt=((ll){cc[i].x/len+0.5}+2*c[i])/6;
        if(cnt) printf("%d : %lld\n",i-60000,cnt);
    }
    return 0;
}

转载于:https://www.cnblogs.com/NLDQY/p/10758961.html

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值