CSU1977-Bit-reversal Permutation-模拟
CSU1977-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(n*2), which arises if one simply applies the definition of DFT, to *O(n*log*n), where n is the data size.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.
? ——From Wikipedia
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 【CSU1977-Bit-reversal Permutation-模拟】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
Hint
中文提示:可以看到,我们最终处理的系数从左至右的编号的二进制形式分别为000,100,010,110,001,101,011,111,若将其二进制反序,可得000,001,010,011,100,101,110,111,这些反序的二进制编码是从小到大排列的。也就是说,我们可以按照每个下标的二进制编码来确定处理系数的顺序。这种方法就称为位逆序置换(Bit-reversal permutation)。
思路 Hint给的提示很明确了,其实就是首先把数组补成2^n个数,对应每个序号将其二进制表示视为一个字符串,对字符串进行排序后按新的顺序输出就好了
AC代码
/**************************************
*Source: CSU1977
*Knowledge Point: ADHOC
*Author: CSUzick
**************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
推荐阅读
- R语言股票收益分布一致性检验KS检验Kolmogorov-Smirnov、置换检验Permutation Test可视化
- Leetcode Permutation I & II
- [线性DP][杨氏矩阵和勾长公式]Mr.|[线性DP][杨氏矩阵和勾长公式]Mr. Young's Picture Permutations
- zcmu|全排列2
- POJ|POJ 1731 Orders 按序输出一个字符串的全排列 next_permutation()
- 1977: Bit-reversal Permutation(递归)
- CSU|CSU 1976: 搬运工小明 1977: Bit-reversal Permutation 1978: LXX的图论题 1979: 古怪的行列式 1980: 不堪重负的树
- next_permutation与使用
- HDOJ|HDOJ 3664 Permutation Counting
- 动态规划-基础|uva 1485 - Permutation Counting(递推)