【BZOJ 1002】[FJOI2007]轮状病毒
2017-10-04 18:45
204 查看
【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1002
【题意】
让你把这个图通过删边操作搞成一棵树;
问方案数;
【题解】
先写个小规模的爆搜然后找规律;
(爆搜程序在最下面)
a[1..10]= 1 5 16 45 121 320 841 2205 5776 15125 就猜呗; 设x*a[n-1]+y*a[n-2]+z=a 然后把前3个带去进去; { 5x+y+z=16 16x+5y+z=45 45x+16y+z=121 } x=3 y=-1 z=2; a = 3*a[n-1]-a[n-2]+2; a[1] = 1; a[2] = 5;
得到递推式之后;
写个单精度乘高精度+单晶加高精+高精减就好;
【完整代码】
/************************************************************** Problem: 1002 User: chengchunyang Language: C++ Result: Accepted Time:0 ms Memory:1336 kb ****************************************************************/ #include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define rei(x) scanf("%d",&x) #define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii; typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int MAXN = 110; struct abc { int a[MAXN],len; void init() { rep1(i,1,100) a[i] = 0; } }; abc f[MAXN]; int n; void sub(abc &a,abc &b) { rep1(i,1,a.len) a.a[i]-=b.a[i]; rep1(i,1,a.len) if (a.a[i]<0) { a.a[i]+=10; a.a[i+1]--; } int &t = a.len; while (a.a[t]==0) t--; } int main() { //freopen("F:\\rush.txt","r",stdin); rep1(i,1,100) f[i].init(); f[1].a[1] = 1,f[1].len = 1; f[2].a[1] = 5,f[2].len = 1; rep1(i,3,100) { //f[i] = 3*f[i-1]-f[i-2]+2; abc t = f[i-1]; int &len = t.len; int x = 0; rep1(j,1,len) { t.a[j]=t.a[j]*3+x; x = t.a[j]/10; t.a[j]%=10; } while (x>0) { len++; t.a[len]=x; x=t.a[len]/10; t.a[len]%=10; } t.a[1]+=2; rep1(j,1,len) { t.a[j+1] += t.a[j]/10; t.a[j]%=10; } if (t.a[len+1]>0) len++; sub(t,f[i-2]); f[i] = t; } rei(n); rep2(i,f .len,1) printf("%d",f .a[i]); return 0; }
//爆搜程序 #include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define rei(x) scanf("%d",&x) #define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii; typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int MAXN = 1100; int n,tot,sta[MAXN],f[MAXN],ans = 0; pii bian[MAXN]; bool bo[MAXN]; int ff(int x) { if (f[x]==x) return x; else return f[x] = ff(f[x]); } void dfs(int x,int xx) { if (x>n) { rep1(i,0,n) f[i] = i; rep1(i,1,n) { int idx = sta[i]; int x = bian[idx].fi,y = bian[idx].se; int r1 = ff(x),r2 = ff(y); if (r1!=r2) f[r1]=r2; else return; } ans++; return; } rep1(i,xx+1,tot) { sta[x] = i; dfs(x+1,i); } } int main() { freopen("F:\\rush.txt","r",stdin); freopen("F:\\rush_out.txt","w",stdout); while(cin>>n) { ans = 0; tot = 2*n; rep1(i,1,n) { bian[i].fi = i,bian[i].se = 0; int x = i,y = i+1; if (y==n+1) y=1; bian[n+i].fi = x,bian[n+i].se = y; } dfs(1,0); cout << ans << endl; } return 0; }
相关文章推荐
- BZOJ 1002 FJOI2007 轮状病毒 递推+高精度
- BZOJ1002: [FJOI2007]轮状病毒
- 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
- BZOJ 1002: [FJOI2007]轮状病毒
- 【bzoj1002】[FJOI2007]轮状病毒
- BZOJ 1002 FJOI2007 轮状病毒 递推+高精度
- bzoj 1002: [FJOI2007]轮状病毒
- [行列式计算]BZOJ1002: [FJOI2007]轮状病毒
- 【bzoj 1002】 [FJOI2007]轮状病毒
- bzoj1002 [FJOI2007]轮状病毒(矩阵树定理+递推+高精度)
- BZOJ 1002([FJOI2007]轮状病毒-基尔霍夫矩阵)
- bzoj 1002[FJOI2007]轮状病毒
- BZOJ 1002 [FJOI2007]轮状病毒
- BZOJ 1002 [FJOI2007]轮状病毒
- BZOJ 1002 [FJOI2007]轮状病毒
- 【递推】【高精度】【FJOI 2007】【bzoj 1002】轮状病毒
- BZOJ 1002: [FJOI2007]轮状病毒【数学题】
- bzoj1002[FJOI2007]轮状病毒 递推+高精度
- bzoj 1002 FJOI2007 轮状病毒 题解
- [Bzoj1002][FJOI2007]轮状病毒