这个题是华为杯的签到题。。。。我和兔兔做完这个果断跪了。。。。
完美数字感应,中文题。【题意就不用写了的说。。。
其实就是找规律:第n(n从0开始)张卡片的第1个数是2^n,其余的数跟据其可由哪些2^k组成,则该数出现在哪个卡片上,比如3=2+1=2^1+2^0,则3出现在第0和1张卡片上,再比如说15吧,15=1+2+4+8=2^0+2^1+2^3+2^4,就是第0,1,2,3张卡片上。做法就是把数转化成二进制就对啦。。。。。然后位数是1则这一位对应的卡片上有这个数,如果是0就没有了。下面是AC代码【没有做过什么优化。。。。代码不优雅。。。
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int card[8193][14];
int n;
void solve()
{
int i,j;
for(i=1;i<=8192;i++)
{
int x=i;
for(j=1;j<=13;j++)
{
if(x==0)
break;
card[i][j]=x%2;
x/=2;
}
}
}
int main()
{
int i,j,k;
solve();
int casen;
scanf("%d",&casen);
while(casen--)
{
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
for(i=1;i<pow(2,n);i++)
{
if(card[i][j]==1)
{
printf("%d ",i);
}
if(i==pow(2,n)-1)//因为n个卡片,最大的数是2^n-1,这个数转换成二进制是111^11(n个1)即每张卡片的最后一个数都是这个数
{
printf("\n");
}
}
}
}
}