您的位置:首页 > 其它

【bzoj1002】[FJOI2007]轮状病毒

2016-09-06 17:54 225 查看

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 4381 Solved: 2393
[Submit][Status][Discuss]

Description

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

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
struct bignum{int len,num[1010];}f[110],p;
int n;
bignum add(bignum a,bignum b)
{
int len;  bignum c;
memset(c.num,0,sizeof(c.num));
if(a.len>=b.len) len=a.len;
else len=b.len;
for(int i=1;i<=len;i++)
{
c.num[i]+=a.num[i]+b.num[i];
if(c.num[i]>=10)
{
c.num[i+1]+=1;
c.num[i]-=10;
}
}
if(c.num[len]>0)
len++;
c.len=len;
return c;
}
bignum Mull(bignum a,int b)
{
int i,len;  bignum c;
len=a.len;
memset(c.num,0,sizeof(c.num));
for(i=1;i<=len;i++)
{
c.num[i]+=(a.num[i]*b);
if(c.num[i]>=10)
{
c.num[i+1]=c.num[i]/10;
c.num[i]=c.num[i]%10;
}
}
len=len+1;
while(c.num[len]>0)
{
c.num[len+1]=c.num[len]/10;
c.num[len++]%=10;
}
c.len=--len;
return c;
}
bignum sub(bignum a1,bignum b1)
{
int len;
if(a1.len>b1.len)  len=a1.len;
else  len=b1.len;
for(int i=1;i<=len;i++)
{
a1.num[i]=a1.num[i]-b1.num[i];
if(a1.num[i]<0)
{
a1.num[i]+=10;
a1.num[i+1]--;
}

}
while(a1.num[len]==0&&len>1)  len--;
a1.len=len;
return a1;
}

void print(bignum c)
{
for(int i=c.len;i>0;i--)
printf("%d",c.num[i]);
printf("\n");
}
int main()
{
scanf("%d",&n);
f[1].len=f[2].len=p.len=1;
f[1].num[1]=1;  f[2].num[1]=5;  p.num[1]=2;
for(int i=3;i<=n;i++)
f[i]=sub(add(Mull(f[i-1],3),p),f[i-2]);
print(f
);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: