41人阅读 评论(0)

# CSU 1977: Bit-reversal Permutation

## Description

A fast Fourier transform (FFT) algorithm computes the discrete Fourier transform (DFT) of a sequence, or its inverse (IFFT). Fourier analysis converts a signal from its original domain (often time or space) to a representation in the frequency domain and vice versa. An FFT rapidly computes such transformations by factorizing the DFT matrix into a product of sparse (mostly zero) factors. As a result, it manages to reduce the complexity of computing the DFT from O(n2), which arises if one simply applies the definition of DFT, to O(nlogn), where n is the data size.

——From Wikipedia

During this summer holiday, csuxushu feels so bored to learn FFT. Because FFT is a complicated algorithm, he need to apply a bit-reversal permutation to a sequence first before DFT which is a part of FFT.

In applied mathematics, a bit-reversal permutation is a permutation of a sequence of n items, where n = 2^k is a power of two. It is defined by indexing the elements of the sequence by the numbers from 0 to n ? 1 and then reversing the binary representations of each of these numbers (padded so that each of these binary numbers has length exactly k). Each item is then mapped to the new position given by this reversed value.

Because all fellows in CSU(California State University ) can apply FFT, NTT or even FWT, it is a shame that he even doesn’t know how to take the first step. As one of the best computer programmer in CSU, can you help him?

You may think this problem is too hard to solve. In fact, it is a piece of cake to you. Remember to see the hint :-)

## Input

The first line of the input gives the number of test cases T(T≤10); T test cases follow.Each test case contains a number sequence.
In each case, the first line is a number N(1≤N≤10^5), the number of elements in the following sequence.The second line is the sequence.Its length may not be exactly a power of two, so you can append some zeros to make it the minimal power of two larger than or equal to N.

## Output

For each test case, output the sequence from input in bit-reversal order.

## Sample Input

1
6
21 58 96 12 45 65

## Sample Output

21 45 96 0 58 65 12 0

2017年8月月赛

## 思路

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int t,n;
int a[100005];
int b[100005];
int btc[100005];
int len;
int reserval(int x)
{
int ans = 0;
for(int i = len-1 ; i >= 0 ; i--)
{
if((x & (1 << len-1-i)) == 0)
continue;
ans = ans | (1 << i);
}
return ans;
}
int main()
{
int num = 1;
for(int i = 2 ; i <= 100000 ; i *= 2)
b[i] = num++;
num = 1;
for(int i = 1 ; i <= 100000 ; i++)
if(!b[i]) btc[i] = num;
else btc[i] = num++;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = 0 ; i < n ; i++)
scanf("%d",&a[i]);
len = btc[n];
int nn  = 1 << btc[n];
for(int i = 0 ; i < nn ; i++)
printf("%d%c",reserval(i) >= n ? 0:a[reserval(i)]," \n"[i == nn-1]);
}
return 0;
}

## 位运算交换 (FFT模板节选)

// 原地快速bit reversal
for(i = 0, j = 0; i < n; i++) {
if(j > i) swap(a[i], a[j]);
int k = n;
while(j & (k >>= 1)) j &= ~k;
j |= k;
}
0
0

【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐（算法+实战）--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：381587次
• 积分：992
• 等级：
• 排名：千里之外
• 原创：18篇
• 转载：0篇
• 译文：0篇
• 评论：5条
文章存档
阅读排行
最新评论