[FJOI2007]轮状病毒

来源:互联网 发布:python 周期性任务 编辑:程序博客网 时间:2024/05/01 17:30
轮状病毒什么的,看着就是dp,看着就是找规律
F(n)=3*F(n-1)-F(n-2)+2
然后就很好做了?等等。n最大100唉?还要再加个高精度。
#include<map>#include<queue>#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#define qread(x) x=read()#define mes(x,y) memset(x,y,sizeof(x))#define mpy(x,y) memcpy(x,y,sizeof(x))#define Maxn 1000#define INF 2147483647inline int read(){    char ch=getchar();    int f=1,x=0;    while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}    return x*f;}struct Sint{int len,c[Maxn+1];void clear(){len=0;mes(c,0);}int give_int(int x){clear();while(x>0){len++;c[len]=x%10;x/=10;}}};void pSint(Sint &x){for(int i=x.len;i>=1;i--)printf("%d",x.c[i]);printf("\n");}Sint sub_int(Sint &x,int y){x.c[1]-=y;for(int i=1;i<=x.len;i++){while(x.c[i]<0){x.c[i+1]--;x.c[i]+=10;}}while(x.c[x.len]==0)x.len--;}Sint sub(Sint &x,Sint &y){x.len=std::max(x.len,y.len);for(int i=1;i<=x.len;i++)x.c[i]-=y.c[i];for(int i=1;i<=x.len;i++){while(x.c[i]<0){x.c[i+1]--;x.c[i]+=10;}}while(x.c[x.len]==0)x.len--;}Sint add(Sint &x,Sint &y){x.len=std::max(x.len,y.len);for(int i=1;i<=x.len;i++)x.c[i]-=y.c[i];for(int i=1;i<=x.len;i++){while(x.c[i]>9){x.c[i+1]+=x.c[i]/10;x.c[i]%=10;}}while(x.c[x.len+1]>0){x.len++;x.c[x.len+1]+=x.c[x.len]/10;x.c[x.len]%=10;}}Sint add_int(Sint &x,int y){x.c[1]+=y;for(int i=1;i<=x.len;i++){while(x.c[i]>9){x.c[i+1]+=x.c[i]/10;x.c[i]%=10;}}while(x.c[x.len+1]>0){x.len++;x.c[x.len+1]+=x.c[x.len]/10;x.c[x.len]%=10;}}Sint multi_int(Sint &x,int y){for(int i=1;i<=x.len;i++)x.c[i]*=y;for(int i=1;i<=x.len;i++){if(x.c[i]>9){x.c[i+1]+=x.c[i]/10;x.c[i]%=10;}}while(x.c[x.len+1]>0){x.len++;x.c[x.len+1]+=x.c[x.len]/10;x.c[x.len]%=10;}}//f[n]=3*f[n-1]-f[n-2]+2int main(){int n;qread(n);if(n==1)printf("1\n");else if(n==2)printf("2\n");else{Sint x,y,z;x.give_int(1);y.give_int(5);for(int i=3;i<=n;i++){z=y;multi_int(z,3);sub(z,x);add_int(z,2);x=y;y=z;}pSint(z);}}
 

查看原文:http://hz2016.tk/blog/?p=58
原创粉丝点击