bzoj 1002 找规律,高精度
,问有多少种情况。
tags:看了题解,f[i]=f[i-1]*3-f[i-2]+2。 有基尔霍夫矩阵推的,也有dp推的,还有写爆搜算出前几个找规律的,
然而,本弱鸡连个爆搜都写不出来,23333
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 200; int n; struct P { int a[N], len; }f[N]; P sub(P b, P c) { b.a[1]+=2; int j=1; while(b.a[j]>9) b.a[j+1]+=b.a[j]/10, b.a[j]%=10, j++; rep(i,1,b.len) { b.a[i]-=c.a[i]; if(b.a[i]<0) b.a[i]+=10, b.a[i+1]--; } while(b.len>1 && b.a[b.len]==0) b.len--; return b; } P mul(P b, int x) { rep(i,1,b.len) b.a[i]*=x; rep(i,1,b.len) { //b.a[i]*=x; //很sb地在这里卡了个bug b.a[i+1]+=b.a[i]/10; b.a[i]%=10; } if(b.a[b.len+1]) b.len++; return b; } void Init() { f[1].len=f[2].len=1; f[1].a[1]=1, f[2].a[1]=5; rep(i,3,N-1) f[i]=sub(mul(f[i-1], 3), f[i-2]); } int main() { Init(); scanf("%d", &n); per(i,f[n].len,1) printf("%d", f[n].a[i]); puts(""); return 0; }