题目链接: http://2012.nwerc.eu/en/results/problems/
题目大意: 给出顶点数为N的图,每个顶点只与相邻的两个顶点相连
所有顶点就连成一个最大环
问删除一些边,但是不能使任何一个顶点成为孤立点
也就是说每个顶点至多删除一条边,有多少种情况?
如: N=4时(绿色表示删除的边)
解题思路: 这道题有规律,写出前四个就可以找出来了
N=3 4
N=4 7
N=5 11
N=6 18
N=7 29
显然每一项是前面两项相加,Fibonacci数列
范围 3 ≤ n ≤ 10000 ,第一项第二项分别是4和7,需要用高精度处理
代码:
//Fibonacci 数列
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 2101
int gaojing (int a[],int b[]) //高精度加法,这个函数使得: b=a,a=a+b***这里是关键,可以自己想
{
int i1,h,hc,c[SIZE]={0};
memcpy(c,a,sizeof(c)); //把a数组拷贝给c数组
for (i1=SIZE;i1>=0;i1--)
{
if (a[i1]!=0) //纪录 a数组最大的位数
break;
}
hc=i1+1;
for (i1=0;i1<SIZE;i1++)
{
a[i1]+=b[i1]; //a = a + b,两数组相加,这个for循环是高精度加法的 核心思想
if (a[i1]>=10) //大于10,进1
{
a[i1+1]+=(a[i1]/10);
a[i1]%=10;
}
if (a[i1]!=0) //纪录a的最大位数
{
h=i1;
}
}
memcpy(b,c,sizeof(c));
return h;
}
int main ()
{
int n,i1,h;
while (scanf ("%d",&n)!=EOF && n>=3)
{
int a[SIZE]={0},b[SIZE]={0};
a[0]=3;
b[0]=1;
//当大于或者等于3的时候
for(i1=3;i1<=n;i1++)
{
h=gaojing(a, b);
}
for (i1=h;i1>=0;i1--) //倒过来输出,因为我的数字是倒置输入到数组的
printf("%d",a[i1]);
printf("\n");
}
return 0;
}
注:原创文章,转载请注明出处