[BZOJ1002]轮状病毒

来源:互联网 发布:怎么在ubuntu上装jdk 编辑:程序博客网 时间:2024/05/01 18:12

基尔霍夫矩阵 并不会推

推荐:

点击打开链接

点击打开链接

总而言之 式子就是f[i]=f[i-1]*3-f[i-2]+2

板子贴这 以后还能当高精度板子用

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cstring>#include<queue>#include<stack>#include<set>#include<map>#include<cmath>#include<iomanip>#define debug(x) cerr<<#x<<"="<<x<<endlusing namespace std;typedef pair<int,int> pii;typedef long long ll;const int INF = 0x7f7f7f7f;const ll INFF = 0x7ffffffff;inline int init(){int now=0,ju=1;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return now*ju;}}inline long long llinit(){long long now=0,ju=1;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return now*ju;}}struct bignumber{int num[1001];int length;};bignumber operator + (bignumber a,int b){bignumber ans=a;ans.num[1]+=b;for(int i=1;i<ans.length;i++){if(ans.num[i]>=10){ans.num[i+1]+=ans.num[i]/10;ans.num[i]%=10;}else break;}if(ans.num[ans.length]>=10){ans.length++;ans.num[ans.length]+=ans.num[ans.length-1]/10;ans.num[ans.length-1]%=10;}return ans;}bignumber operator + (bignumber a,bignumber b){bignumber ans;int minlen=min(a.length,b.length);int maxlen=max(a.length,b.length);for(int i=1;i<=maxlen;i++){ans.num[i]=0;}for(int i=1;i<=minlen;i++){ans.num[i]+=a.num[i]+b.num[i];//有可能一开始已经被进位就错了if(ans.num[i]>=10){ans.num[i+1]+=(ans.num[i]/10);ans.num[i]%=10;}}for(int i=minlen+1;i<=maxlen;i++){ans.num[i]+=a.num[i]+b.num[i];if(ans.num[i]>=10){ans.num[i+1]+=(ans.num[i]/10);ans.num[i]%=10;}}if(ans.num[maxlen+1]!=0){ans.length=maxlen+1;}else ans.length=maxlen;return ans;}bignumber l;bignumber operator * (bignumber x,int b){bignumber ans=l;ans.length=x.length;for(int i=1;i<=x.length;i++){ans.num[i]+=x.num[i]*b;ans.num[i+1]+=ans.num[i]/10;ans.num[i]%=10;}if(ans.num[x.length+1]!=0){ans.length++;}return ans;}bool cmp(bignumber a,bignumber b){if(a.length>b.length)return true;else if(a.length<b.length)return false;else {for(int i=a.length;i>=1;i--){if(a.num[i]>b.num[i])return true;else if(a.num[i]<b.num[i])return false;}}}bignumber operator - (bignumber a,bignumber b){bignumber ans,tmp;if(!cmp(a,b)){tmp=a;a=b;b=tmp;}for(int i=1;i<=b.length;i++){a.num[i]-=b.num[i];while(a.num[i]<0){a.num[i+1]--;a.num[i]+=10;}}return a;}int main(){int n;n=init();if(n==1){printf("1");return 0;}else if(n==2){printf("5");return 0;}bignumber f1,f2,f;f1.num[1]=5;f2.num[1]=1;f1.length=1;f2.length=1;bignumber temp;for(int i=3;i<=n;i++){temp=f1;f1=f1*3;f=f1-f2;f=f+2;f2=temp;f1=f;}for(int i=f.length;i>=1;i--){printf("%d",f.num[i]);}return 0;}

补充:

这个题由于只会出现*10以内的情况,因此不会错

假如超过10怎么办?

bignumber operator * (bignumber x,int b)  {      bignumber sum=l;      sum.length=x.length;      for(int i=1;i<=x.length;i++)      {          sum.num[i]+=x.num[i]*b;          sum.num[i+1]+=sum.num[i]/10;          sum.num[i]%=10;      }      while(sum.num[sum.length+1]!=0)      {      sum.num[sum.length+2]+=sum.num[sum.length+1]/10;    sum.num[sum.length+1]%=10;        sum.length++;      }      return sum;  }  

//或者你也可以去写高精*高精……


0 0
原创粉丝点击