派遣敢死队

来源:互联网 发布:侵犯网络隐私权的案例 编辑:程序博客网 时间:2024/04/28 01:20

问题:G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。

请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。

输入格式

输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。

接下来n-1个数,分别表示编号为2, 3, ..., n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。

输出格式

输出一个整数,表示派出敢死队的方案数。由于数目可能很大,你只需要输出这个数除10007的余数即可。

#include<stdio.h>#include<math.h>int main(){int a[100001],b[100001];//上级编号和士兵编号 int count,temp;int n,flag;scanf("%d",&n);a[0]=0;//G没有上级 count=0;for(int i=1;i<n;i++)scanf("%d",&a[i]);for(int i=0;i<pow(2,n);i++){temp=i;for(int j=0;j<n;j++){b[j]=temp%2;temp/=2;}flag=1;for(int j=0;j<n;j++){if(b[j]&&b[a[j]-1]){flag=0;break;}}if(flag){count++;count%=10007;}} printf("%d\n",count-1);return 0;}


原创粉丝点击