BZOJ 3513: [MUTC2013]idiots FFT

Code: 

#include<bits/stdc++.h> 
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 400003 
#define ll long long 
using namespace std;  
namespace IO 
{
    inline int read()
    {
        int ans=0;
        char ch=getchar();
        while(!isdigit(ch))ch=getchar();
        while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
        return ans;
    }
};  
const double pi=acos(-1.0); 
struct cpx
{ 
    double x,y; 
    cpx(double a=0,double b=0){ x=a,y=b; } 
    cpx operator+(const cpx b) { return cpx(x+b.x, y+b.y); } 
    cpx operator-(const cpx b) { return cpx(x-b.x, y-b.y); } 
    cpx operator*(const cpx b) { return cpx(x*b.x-y*b.y,x*b.y+y*b.x); }
}A[maxn],B[maxn];      
inline void FFT(cpx *a,int n,int flag)
{
    for(int i=0,k=0;i<n;++i) 
    {
        if(i>k) swap(a[i], a[k]); 
        for(int j=(n>>1);(k^=j)<j;j>>=1); 
    } 
    for(int mid=1;mid<n;mid<<=1)
    {
        cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y; 
        for(int i=0;i<n;i+=(mid<<1))
        {
            cpx w(1,0); 
            for(int j=0;j<mid;++j) 
            {
                x=a[i+j],y=w*a[i+j+mid];       
                a[i+j]=x+y, a[i+j+mid]=x-y;    
                w=w*wn;    
            }
        }
    }
    if(flag==-1) for(int i=0;i<n;++i) a[i].x/=(double)n;    
}
int f[maxn], arr[maxn], g[maxn]; 
ll answer[maxn];       
inline void solve() 
{
    int n,Max=0,len; 
    n=IO::read();       
    for(int i=1;i<=n;++i) arr[i]=IO::read(), ++f[arr[i]], Max=max(Max, arr[i]);    
    for(int i=Max;i>=1;--i) g[i]=f[i]+g[i+1];           
    for(int i=1;i<=Max;++i) A[i].x=(double)f[i];                
    for(len=1;len<=(Max<<1);len<<=1); 
    FFT(A,len,1);   
    for(int i=0;i<len;++i) A[i]=A[i]*A[i];   
    FFT(A,len,-1);           
    for(int i=1;i<len;++i) 
    {
        answer[i]=(ll)(A[i].x+0.5);     
        if(!answer[i]) continue;   
        if(i%2==0) answer[i]-=f[i>>1];    
        answer[i]>>=1;   
    }   
    ll up,down; 
    up=down=(ll)n*(n-1)*(n-2)/6;        
    for(int i=0;i<=len;++i) up-=answer[i]*(ll)g[i];   
    printf("%.7f\n",(double)up/(double)down);       
    memset(A,0,sizeof(A)), memset(f,0,sizeof(f)), memset(g,0,sizeof(g));    
}
int main()
{ 
    // setIO("input"); 
    int T; 
    T=IO::read();    
    while(T--) solve(); 
    return 0; 
}

  

内容概要:本文档详细介绍了基于事件触发扩展状态观测器(ESO)的分布式非线性车辆队列控制系统的实现。该系统由N+1辆车组成(1个领头车和N个跟随车),每辆车具有非线性动力学模,考虑了空气阻力、滚动阻力等非线性因素及参数不确定性和外部扰动。通过事件触发ESO估计总扰动,基于动态面控制方法设计分布式控制律,并引入事件触发机制以减少通信和计算负担。系统还包含仿真主循环、结果可视化等功能模块。该实现严格遵循论文所述方法,验证了观测误差有界性、间距误差收敛性等核心结论。 适合人群:具备一定编程基础,对非线性系统控制、事件触发机制、扩展状态观测器等有一定了解的研发人员和研究人员。 使用场景及目标:①研究分布式非线性车辆队列控制系统的理论与实现;②理解事件触发机制如何减少通信和计算负担;③掌握扩展状态观测器在非线性系统中的应用;④学习动态面控制方法的设计与实现。 其他说明:本文档不仅提供了详细的代码实现,还对每个模块进行了深入解析,包括非线性建模优势、ESO核心优势、动态面控制与传统反步法对比、事件触发机制优化等方面。此外,文档还实现了论文中的稳定性分析,通过数值仿真验证了论文的核心结论,确保了系统的稳定性和有效性。建议读者在学习过程中结合代码进行实践,并关注各个模块之间的联系与相互作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值