【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
1002: [FJOI2007]轮状病毒
Description
给定n(N<=100),编程计算有多少个不同的n轮状病毒。

Input
第一行有1个正整数n。
Output
将编程计算出的不同的n轮状病毒数输出
Sample Input
Sample Output
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
//typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int maxl = ;
const int ten[]={,,,,};
struct Biginter{
int d[maxl]; // 最大数位只取四位,因为相乘不会爆int~~,并且每次构造对象时d[]一定要为0;
Biginter(char *s){
int len = strlen(s);
d[] = (len-)/+;//每一个数组里面存四位,并且d[0]记录的是最多总的位数(下标)
int i,j,k;
for(i = ;i <= d[];i++) d[i] = ;
for(i = len-;i >= ;i--){
j = (len--i)/+; //保存的下标;
k = (len--i)%;//在每一个下标保存中仍然要保存顺序;
d[j] += ten[k]*(s[i]-'');
}
while(d[] > && d[d[]] == ) d[]--; //可能就为0;
}
Biginter(){MS0(d);}//手动初始化为0
void tostring(){ //输出后换行
out(d[d[]]);
for(int i = d[]-;i > ;i--){
printf("%04d",d[i]);
}
puts("");
}
};
bool operator <(const Biginter& a,const Biginter& b)
{
if(a.d[] != b.d[]) return a.d[] < b.d[];
for(int i = a.d[];i >= ;i--){
if(a.d[i] != b.d[i]) return a.d[i] < b.d[i];
}
return false;// a== b
}
bool operator ==(const Biginter& a,const Biginter& b)
{
if(a.d[] != b.d[]) return false;
for(int i = a.d[];i >= ;i--){
if(a.d[i] != b.d[i]) return false;
}
return true;
}
Biginter operator +(const Biginter& a,const Biginter& b)
{
Biginter c;
c.d[] = max(a.d[],b.d[]);
for(int i = ;i <= c.d[];i++){
c.d[i] += a.d[i]+b.d[i];
if(c.d[i] >= ten[]){//其实每次只需要看是否要进1即可;
c.d[i] -= ten[],c.d[i+]++;
if(i == c.d[]){
++c.d[];
break;
}
}
}
return c;
}
Biginter operator -(const Biginter& a,const Biginter& b){
Biginter c;
c.d[] = a.d[];
for(int i = ;i <= c.d[];i++){
c.d[i] += a.d[i] - b.d[i];
if(c.d[i] < ){
c.d[i] += ten[];
c.d[i+]--;
}
}
while(c.d[] > && c.d[c.d[]] == ) c.d[]--;
return c;
}
Biginter operator *(const Biginter& a,const Biginter& b)
{
Biginter c;
c.d[] = a.d[]+b.d[];
for(int i = ;i <= a.d[];i++){
int x = ;
for(int j = ;j <= b.d[];j++){
x += a.d[i]*b.d[j]+c.d[i+j-];
c.d[i+j-] = x%ten[];//相乘时需要记录超出多少需要mod,但相加减时超出数值就是1~~不用mod更快
x /= ten[];
}
c.d[i+b.d[]] = x;//***
}
while(c.d[] > && c.d[c.d[]] == ) c.d[]--;
return c;
}
int main()
{
Biginter F[]={"","",""},F3(""),F2("");
rep1(i,,)
F[i] = F[i-]*F3 - F[i-] + F2;
int n;
while(scanf("%d",&n) == ){
F[n].tostring();
}
return ;
}
【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度的更多相关文章
- BZOJ 1002 FJOI2007 轮状病毒 递推+高精度
题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring& ...
- 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Inpu ...
- bzoj 1002 [FJOI2007]轮状病毒 高精度&&找规律&&基尔霍夫矩阵
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2234 Solved: 1227[Submit][Statu ...
- BZOJ 1002: [FJOI2007]轮状病毒【生成树的计数与基尔霍夫矩阵简单讲解+高精度】
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5577 Solved: 3031[Submit][Statu ...
- BZOJ 1002 [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3106 Solved: 1724[Submit][Statu ...
- 生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3928 Solved: 2154[Submit][Statu ...
- 【刷题】BZOJ 1002 [FJOI2007]轮状病毒
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
- bzoj 1002 [FJOI2007]轮状病毒——打表找规律
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 看 Zinn 的博客:https://www.cnblogs.com/Zinn/p/9 ...
- 1002: [FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2609 Solved: 1450[Submit][Statu ...
随机推荐
- Helpers\Data
Helpers\Data Data helper contains a bunch of useful methods for looking at and altering your data. D ...
- c语言实例
#include <stdio.h> int main() { ; ; i=max(j,k); printf("i=%d\n",i); ; } int max(int ...
- python--判断数据类型可不可变
内存是一块空间,可以比喻成一个比较大的房子,定义一个变量就是在大房子中建立一个小房子,判断一个数据类型可不可变,就是看在这个这个大房子中有没有新建小房子,可以通过id来判断,如果id没有变化则是不可变 ...
- DataGrid的ItemCreated和ItemDataBound以及合计平均行
DataGrid为数据绑定控件,是重量级控件,臃肿,无华不实这么一个控件定位.如果做为管理系统,那么还是可以使用的. 本文只是为了记录ItemCreated和ItemDataBound两个事件的用法. ...
- CentOS7安装RabbitMQ集群
实验环境 RabbitMQ 集群 server1.example.com IP: 10.10.10.11 Node: diskserver2.example.com IP: 10.1 ...
- mysql计算连续天数,mysql连续登录天数,连续天数统计
mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...
- 用js实现跳转提示页面
效果图: 网页布局 <p>操作成功</p> <strong>5</strong><span>秒后回到主页</span><a ...
- 【原创】java 流星划过天空
import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.s ...
- SQL server 数据库日志文件过大清空日志文件
SQL2008:'在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. USE [master] GO ALTER DATABASE DBName SET RECOVER ...
- C#之装箱和拆箱
在实际编码过程中,有时候会出现装箱和拆箱操作.下面就类分别认识一下: 需要注意的是,类型转换和这个是不同的.Convert方法并没有发生装箱和拆箱操作,而是类型转换,包括int.parse等等. 装箱 ...