题目大意:
主要看编码规则:如果初始样例是a(1),…,a(n),那么第i个和s(i)和差d(i)计算如下:
for i = 1,…,n/2:
s(i) = a(2*i-1) + a(2*i)
d(i) = a(2*i-1) - a(2*i)
例子就不说明了。
我们的任务是根据编码的结果,反输出原始样例。
解题思路:
我们定义一个2维数组s,用于记录结果,然后按照一个简单的一元二次方程计算出
原始结果即可。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
int n,s[2][257],i,k,temp;
while(scanf("%d",&n)&&n)
{
k=1;
for(i=0;i<n;i++)
{
scanf("%d",&s[0][i]);
s[1][i]=s[0][i];
}
temp=1;
while(temp<=n/2)
{
for(i=0;i<temp;i++)
{
s[k][i*2]=(s[!k][i]+s[!k][i+temp])/2;
s[k][i*2+1]=(s[!k][i]-s[!k][i+temp])/2;
}
temp*=2;
k=(k+1)%2;
}
k=(k+1)%2;
for(i=0;i<n;i++)
{
printf("%d",s[k][i]);
if(i!=n-1) printf(" ");
}
printf("\n");
}
return 0;
}