Description
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示
N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示
现给定n(N<=100),编程计算有多少个不同的n轮状病毒
Input
第一行有1个正整数n
Output
计算出的不同的n轮状病毒数输出
基尔霍夫矩阵(啥...) 递推式f(i)=f(i-1)*3-f(i-2)+2
#include<iostream> #include<cstring> #include<cstdio> using namespace std; ; int f1[maxn],f2[maxn]; void add(int* a,int *b,int* c){ memset(c,,sizeof(c)); ; ;i<maxn;i++){ c[i]=a[i]+b[i]+x; x=c[i]/;c[i]%=; } } void del(int *a,int *b,int *c){//保证a>b memset(c,,sizeof(c)); ;i<maxn;i++){ if(a[i]<b[i]){ a[i]+=; a[i+]--; } c[i]=a[i]-b[i]; } } void g(){ int t1[maxn],t2[maxn],t3[maxn],t4[maxn],t5[maxn]; memset(t4,,]=; add(f1,f1,t1),add(t1,f1,t2); del(t2,f2,t3);add(t3,t4,t5); ;i<maxn;i++) f2[i]=f1[i],f1[i]=t5[i]; } void printAns(){ ;i>=;i--){ ) continue; ;j--){ printf("%d",f1[j]); }break; } } void init(){ memset(f1,,sizeof(f1)); memset(f2,,sizeof(f2)); f1[]=,f2[]=; } int main() { init(); int p;scanf("%d",&p); ;i<p-;i++) g(); printAns(); ; }
//高精写的太丑了...然而这还是调了半天才对...
From Linux