描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1002
)*&*(^&*^&*^**()*)
分析
题目是求一种特殊的图的生成树的个数,但是貌似有更一般的算法,等明天再看吧...
只搞懂了打表找规律,然后题推的解法.
随便写个暴力打个表(其实我并不会写,明天再写吧今天好累),找一找规律.
1~14的答案如下
1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 710645
奇数项
1 16 121 841 5776 39601 271441
开根号得
1 4 11 29 76 199 521
a[i]=a[i-1]*3-a[i-2]
偶数项
5 45 320 2205 15125 103680 710645
除以5得
1 9 64 441 3025 20736 142129
开根号得
1 3 8 21 55 144 377
a[i]=a[i-1]*3-a[i-2]
注意要用高精(学习了别人的高精写法,自己写得太小学生了)
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; struct Big_Integer{ int x[100],cnt; int & operator [] (int id){ return x[id]; } void operator = (int y){ x[1]=y; cnt=1; } }f[100]; Big_Integer operator - (Big_Integer x,Big_Integer y){ Big_Integer z=f[0]; z.cnt=max(x.cnt,y.cnt); for(int i=1;i<=z.cnt;i++){ z[i]+=x[i]-y[i]; if(z[i]<0) z[i+1]--, z[i]+=10; } while(z.cnt&&!z[z.cnt]) z.cnt--; return z; } Big_Integer operator * (Big_Integer x,Big_Integer y){ Big_Integer z=f[0]; for(int i=1;i<=x.cnt;i++){ for(int j=1;j<=y.cnt;j++){ z[i+j-1]+=x[i]*y[j],z[i+j]+=z[i+j-1]/10,z[i+j-1]%=10; } } z.cnt=x.cnt+y.cnt; if(!z[z.cnt]) z.cnt--; return z; } Big_Integer operator * (Big_Integer x,int y){ Big_Integer z=f[0]; for(int i=1;i<=x.cnt;i++){ z[i]+=x[i]*y,z[i+1]+=z[i]/10,z[i]%=10; } z.cnt=x.cnt; if(z[z.cnt+1]) z.cnt++; return z; } ostream& operator << (ostream &out,Big_Integer x){ for(int i=x.cnt;i;i--){ out << x[i]; } return out; } int n; int main(){ cin >> n; f[1]=1; f[2]=n&1?4:3; int last=n+1>>1; for(int i=3;i<=last;i++){ f[i]=f[i-1]*3-f[i-2]; } cout << f[last]*f[last]*(n&1?1:5) << endl; return 0; }
时间: 2024-11-14 10:51:23