UVA 1646 Edge Case(高精度)

https://vjudge.net/problem/UVA-1646

 

题意:

n个点连成一个圈,求没有公共点的边集的个数

 

dfs出前10个,发现

n=3  ans=4

n=4  ans=7

之后 ans[i]=ans[i-1]+ans[i-2]

 

#include<cstdio>
#include<cstring> 
#include<algorithm>
using namespace std;
int ans[10001][15010];
int main()
{
    int n;
    ans[3][0]=1; ans[3][1]=4;
    ans[4][0]=1; ans[4][1]=7;
    for(int i=5;i<=10000;i++)
    {
        for(int j=1;j<=max(ans[i-1][0],ans[i-2][0]);j++)
        {
            ans[i][j]+=ans[i-1][j]+ans[i-2][j];
            ans[i][j+1]=ans[i][j]/10;
            ans[i][j]%=10;
        }
        ans[i][0]=max(ans[i-1][0],ans[i-2][0]);
        if(ans[i][ans[i][0]+1]) ans[i][0]++;
    }
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=ans[n][0];i;i--) printf("%d",ans[n][i]);
        printf("\n");
    }
}

 

找规律代码:

#include<cstdio>
using namespace std;
int y;
bool ok(int x)
{
    if(x==1) return true;
    if(x&(x<<1)) return false;
    int a,b;
    a=x&1; b=0;
    int sum=0;
    while(x) { sum++; b=x&1; x>>=1;}
    if(sum!=y) return true;
    return a!=b;
}
int main()
{
    for(int i=3;i<=10;i++)
    {
        y=i;
        int s=1<<i,ans=0;
        for(int j=1;j<s;j++)
        if(ok(j)) ans++;
        printf("%d\n",ans+1);
    }
} 

 

posted @ 2017-08-21 20:33  TRTTG  阅读(354)  评论(0)    收藏  举报