• [bzoj1002][FJOI2007]轮状病毒_递推_高精度


    轮状病毒 bzoj-1002 FJOI-2007

    Description

      轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
    和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示

      N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
    同的3轮状病毒,如下图所示

      现给定n(N<=100),编程计算有多少个不同的n轮状病毒

    Input

      第一行有1个正整数n

    Output

      计算出的不同的n轮状病毒数输出

    Sample Input

    3

    Sample Output

    16
    想法:别在意...我只是不知道原理而已
    f[i]=3*f[i-1]-f[i-2]+2,然后...这题tm高精度
    最后,附上丑陋的代码... ...
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct Node
    {
    	int a[101],len;
    };
    int n;
    Node mul(Node a,int k)
    {
    	for(int i=1;i<=a.len;i++)
    	{
    		a.a[i]*=k;
    	}
    	for(int i=1;i<=a.len;i++)
    	{
    		a.a[i+1]+=a.a[i]/10;
    		a.a[i]%=10;
    	}
    	if(a.a[a.len+1]!=0) a.len++;
    	return a;
    }
    Node dispose(Node a,Node b)
    {
    	a.a[1]+=2;
    	int j=1;
    	while(a.a[j]>=10)
    	{
    		a.a[j]%=10;
    		a.a[j+1]++;
    		j++;
    	} 
    	for(int i=1;i<=a.len;i++)
    	{
    		a.a[i]-=b.a[i];
    		if(a.a[i]<0)
    		{
    			a.a[i]+=10;
    			a.a[i+1]--;
    		}
    	}
    	while(a.a[a.len]==0)
    		a.len--;
    	return a;
    }
    int main()
    {
    	Node f[101];
    	f[1].a[1]=1;
    	f[2].a[1]=5;
    	f[1].len=f[2].len=1;
    	scanf("%d",&n);
    	for(int i=3;i<=n;i++)
    	{
    		f[i]=dispose(mul(f[i-1],3),f[i-2]);
    	}
    	for(int i=f[n].len;i>0;i--)
    	{
    		printf("%d",f[n].a[i]);
    	}
    	return 0;
    }
    

      小结:打表就是优越

  • 相关阅读:
    Validate US Telephone Numbers
    7月份总结
    Arguments Optional
    Everything Be True
    手机开发网页模板(20140124)
    整站开发初始化
    switch滑动开关
    js 面向对象
    Bootstrap 导航栏
    Bootstrap 标签页
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9284486.html
Copyright © 2020-2023  润新知