bzoj1002: [FJOI2007]轮状病毒

并不会推公式。。。网上也找不到推的方法?!?QAQ终于会写高精度~(≧▽≦)/~啦啦啦

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define REP(i,s,t) for(int i=s;i<=t;i++)
struct node{
	int a[100];int len;
};
node f[105];
node mly(node a,int x){
	rep(i,a.len) a.a[i]*=x;
	rep(i,a.len) a.a[i+1]+=a.a[i]/10,a.a[i]%=10;
	if(a.a[a.len+1]) a.len++;
	return a;
}
node down(node a,node b){
	rep(i,a.len) {
		a.a[i]-=b.a[i];
		if(a.a[i]<0) a.a[i]+=10,a.a[i+1]--;
	}
	a.a[1]+=2;int cur=1;
	while(a.a[cur]>=10) a.a[cur]%=10,a.a[cur+1]++,cur++;
	while(!a.a[a.len]) a.len--;
	return a;
}
int main(){
	int n;scanf("%d",&n);
	f[1].a[1]=1;f[2].a[1]=5;f[1].len=f[2].len=1;
	REP(i,3,n) f[i]=down(mly(f[i-1],3),f[i-2]);
	for(int i=f[n].len;i;i--) printf("%d",f[n].a[i]);
	return 0;
}

  

1002: [FJOI2007]轮状病毒

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4173  Solved: 2306
[Submit][Status][Discuss]

Description

  轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的。一个N轮状基由圆环上N个不同的基原子
和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道。如下图所示

  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示

  现给定n(N<=100),编程计算有多少个不同的n轮状病毒

Input

  第一行有1个正整数n

Output

  计算出的不同的n轮状病毒数输出

Sample Input

3

Sample Output

16

HINT

 

Source

 
[Submit][Status][Discuss]
原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5671786.html