您的位置:首页 > 其它

[BZOJ 1002] [FJOI 2007] 轮状病毒

2015-05-26 22:45 357 查看

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 3045 Solved: 1687
[Submit][Status][Discuss]

Description

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

#include<bits/stdc++.h>
using namespace std;
struct bn {
int len;
int k[110];
}f[101];
// f(i)=3f(i-1)-f(i-2)+2
bn mul(bn a) {
bn ans;
memset(ans.k,0,sizeof(ans.k));
ans.len=a.len;
for (int i=1;i<=a.len;++i) {
ans.k[i]+=a.k[i]*3;
if (ans.k[i]>=10) {
ans.k[i+1]+=ans.k[i]/10;
ans.k[i]%=10;
}
}
if (ans.k[ans.len+1]>0) ans.len++;
return ans;
}
bn addtwo(bn a) {
bn ans;
ans.len=a.len;
memset(ans.k,0,sizeof(ans.k));
for (int i=1;i<=ans.len;++i)
ans.k[i]=a.k[i];
ans.k[1]+=2;
int ka=1;
while(ans.k[ka]>=10) {
ans.k[ka+1]+=ans.k[ka]/10;
ans.k[ka++]%=10;
}
if (ka>ans.len) ans.len=ka;
return ans;
}
bn xminus(bn a, bn b) {
bn ans;
ans.len=a.len;
memset(ans.k,0,sizeof(ans.k));
for (int i=1;i<=a.len;++i) {
ans.k[i]+=a.k[i]-b.k[i];
if (ans.k[i] < 0) {
ans.k[i]+=10;
ans.k[i+1]--;
}
}
while(ans.k[ans.len]==0) ans.len--;
return ans;
}
int main() {
int n; scanf("%d",&n);
//for (int i=1;i<=n;++i) memset(f[i].k,0,sizeof(f[i].k));
f[1].k[1]=1;f[2].k[1]=5;f[1].len=1;f[2].len=1;
//bn ans=xminus(mul(f[2]),f[1]);
//for (int i=ans.len;i>=1;--i) printf("%d",ans.k[i]);
for (int i=3;i<=n;++i) f[i]=addtwo(xminus(mul(f[i-1]),f[i-2]));
//f
=mul(f[2]);
for (int i=f
.len;i>=1;--i) printf("%d",f
.k[i]);
return 0;
}


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