hihocoder1388 Periodic Signal

FFT 就可以了 比赛时候没时间做了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 6e4+5;

int A[MAXN<<2], B[MAXN<<2], C[MAXN<<2];
struct FFTSOLVE {
    int pos[MAXN<<2];
    struct comp {
        double r , i ;
        comp ( double _r = 0 , double _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 , i * x.r + r * x.i ) ;
        }
        comp conj () {
            return comp ( r , -i ) ;
        }
    } A[MAXN<<2] , B[MAXN<<2] ;
    const double pi = acos ( -1.0 ) ;
    void FFT ( comp a[] , int n , int t ) {
        for ( int i = 1 ; i < n ; ++ i ) if ( pos[i] > i ) swap ( a[i] , a[pos[i]] ) ;
        for ( int d = 0 ; ( 1 << d ) < n ; ++ d ) {
            int m = 1 << d , m2 = m << 1 ;
            double 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 mul ( int *a , int *b , int *c ,int k) {
        int i , j ;
        for ( i = 0 ; i < k ; ++ i ) A[i] = comp ( a[i] , b[i] ) ;
        j = __builtin_ctz ( k ) - 1 ;
        for ( int i = 0 ; i < k ; ++ i ) {
            pos[i] = pos[i >> 1] >> 1 | ( ( i & 1 ) << j ) ;
        }
        FFT ( A , k , 1 ) ;
        for ( int i = 0 ; i < k ; ++ i ) {
            j = ( k - i ) & ( k - 1 ) ;
            B[i] = ( A[i] * A[i] - ( A[j] * A[j] ).conj () ) * comp ( 0 , -0.25 ) ;
        }
        FFT ( B , k , -1 ) ;
        for ( int i = 0 ; i < k ; ++ i ) {
            c[i] = ( long long ) ( B[i].r + 0.5 );
        }
    }
}boy;

int N;
int s1[MAXN], s2[MAXN];
int main(){
    int T; scanf("%d",&T);
    while(T--) {
        ll ans = 0;
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        scanf("%d",&N);
        for(int i = 0; i < N; ++i) {
            scanf("%d",&s1[i]); 
        } 
        for(int i = 0; i < N; ++i) {
            scanf("%d",&s2[i]); 
        }

        int len = 1; while(len < N*2) len <<= 1;
        for(int i = 0; i < N; ++i) {
            A[i] = s1[N-i-1]; B[i] = s2[i];
        }
        for(int i = N; i < 2*N; ++i) {
            A[i] = 0; B[i] = s2[i-N];
        }
        boy.mul(A,B,C,len);

        double an = -1; double eps = 1e-8; int pos;
        for(int i = 0; i < N; ++i) {
            if(an+eps < boy.B[i+N-1].r) {
                an = boy.B[i+N-1].r; pos = i;
            }
        }

        for(int i = 0; i < N; ++i) {
            ans += 1ll*(s1[i]-s2[(i+pos)%N]) * (s1[i]-s2[(i+pos)%N]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
### 周期性广告的概述及实现方法 周期性广告(Periodic Advertising)是蓝牙低功耗(BLE)协议栈中的一项功能,旨在通过优化广播机制来减少设备功耗和提升通信效率。与传统广播相比,周期性广告具有更高效的特性[^2]。 #### 1. 周期性广告的基本原理 周期性广告允许设备以固定的间隔发送广告数据包,而扫描设备可以选择性地同步这些广告数据包的时间戳和内容。这种方式可以显著降低扫描端的功耗,因为扫描设备不需要持续监听所有信道,而是可以在特定时间窗口内捕获广告数据[^2]。 #### 2. 实现周期性广告的关键要素 - **广告间隔**:周期性广告的核心参数之一是广告间隔,它决定了广告数据包的发送频率。广告间隔越短,数据更新越快,但功耗也会增加。 - **同步机制**:扫描设备需要通过初始扫描捕获广告数据包的时间戳,并基于此计算后续数据包的接收时间窗口。这种同步机制确保了扫描设备能够高效地捕获广告数据[^2]。 - **信道选择**:与传统广播不同,周期性广告通常仅使用一个或少数几个信道进行传输,从而减少了多信道切换带来的开销。 #### 3. 周期性广告的应用场景 周期性广告广泛应用于以下场景: - **传感器网络**:周期性广告适合用于低功耗传感器设备的数据传输,例如温度、湿度等环境监测数据。 - **Beacon设备**:周期性广告可以替代传统的BLE广播,提供更高效、更低功耗的Beacon功能。 - **定位服务**:通过周期性广告,设备可以向扫描端发送精确的时间戳信息,用于室内定位或资产追踪[^2]。 #### 4. 实现周期性广告的技术细节 以下是使用Ubertooth工具捕获周期性广告数据的示例代码: ```python from ubertooth import Ubertooth def capture_periodic_advertising(channel=37): # 初始化Ubertooth设备 ubertooth = Ubertooth() ubertooth.set_channel(channel) # 捕获周期性广告数据 while True: packet = ubertooth.receive_packet() if packet.is_periodic_advertising(): print(f"Received periodic advertising on channel {channel}: {packet.data}") # 示例调用 capture_periodic_advertising() ``` 上述代码展示了如何使用Ubertooth工具捕获指定信道上的周期性广告数据[^1]。 #### 5. 周期性广告的限制 尽管周期性广告具有诸多优势,但也存在一些限制: - **单向通信**:周期性广告仍然是一对多的单向通信模式,无法支持双向交互。 - **数据量限制**:广告数据包的容量有限,不适合传输大量数据。 - **同步依赖**:扫描设备需要准确同步广告数据包的时间戳,否则可能导致数据丢失。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值