[UVa 1646] Edge Case
手动模拟一下,发现是一个广义斐波那契数列,\(F_1=1,F_2=3,F_n=F_{n-1}+F_{n-2}\)
证明,,,懒得证,,,
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int width=4,base=1e4,MAXN=1e5+1;
int buf[MAXN];
struct BigInt{
int s[MAXN],len;
BigInt(){
memset(s,0,sizeof(s));
len=0;
}
BigInt operator = (const int& m){
memset(s,0,sizeof(s));
len=0;
int n=m;
if(!n) {
s[len++]=n;
} else {
while(n){
s[len++]=n%base;
n/=base;
}
}
return *this;
}
};
void add(BigInt& a,BigInt& b,BigInt& c){
memset(c.s,0,sizeof(c.s));
c.len=0;
int g=0;
for(int i=0;;i++){
if(i>=a.len && i>=b.len && !g) break;
int x=g;
if(i<a.len) x+=a.s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%base;
g=x/base;
}
while(!c.s[c.len-1] && c.len>1) c.len--;
}
inline void scanf(BigInt& n){
memset(n.s,0,sizeof(n.s));
n.len=0;
int x=getchar(),l=0;
while(x<'0'||x>'9') x=getchar();
while(x>='0'&&x<='9') {buf[l++]=x-'0';x=getchar();}
int g=0;
for(int i=l-1,j=1,k=1;i>=0;i--,j++){
g=g+buf[i]*k;
if(j%width==0 || i==0){
n.s[n.len++]=g;
g=0;k=1;
} else {k*=10;}
}
while(!n.s[n.len-1] && n.len>1) n.len--;
}
inline void printf(BigInt& n){
char buf[width+1];
printf("%d",n.s[n.len-1]);
for(int i=n.len-2;i>=0;i--) {
sprintf(buf,"%04d",n.s[i]);
printf("%s",buf);
}
}
int main(){
int n;
while(scanf("%d",&n)==1) {
BigInt s,t,ans;
s=1;t=3;
for(int i=3;i<=n;i++){
add(s,t,ans);
s=t;t=ans;
}
printf(ans);
printf("\n");
}
return 0;
}
一次 AC ,不容易啊