bzoj1002 生成树计数 找规律
这道题第一眼是生成树计数,n是100,是可以用O(n^3)的求基尔霍夫矩阵的n-1阶的子矩阵的行列式求解的,但是题目中并没有说取模之类的话,就不好办了。
用高精度?有分数出现。
用辗转相除的思想,让它不出现分数。但过程中会出现负数,高精度处理负数太麻烦。
用Python打表?好吧,Python还不熟,写不出来。。。。。
所以,如果这道题我考场上遇到,最多用double骗到n<=20的情况的部分分。
最终只能求助于题解了。。。
好像是通过观察行列式的特点,推导出关于答案f(n)的递推式(f(n)=3*f(n-1)-f(n-2)+2)
这道题就这样水过了,收获是:
1、题目可能属于某一类问题,该类问题又有通法可解,但题目一般不能直接套用之,此时就只能观察题目较之一般问题的特殊之处,尝试利用它帮助解题。
2、当1行不通时,可以先用暴力把规模较小的解跑出来,再看看可否推出规律。
回顾一下高精:
#include <cstdio>
#include <cstring>
#include <iostream>
#define M 10
using namespace std; struct Num {
int v[], len;
Num(){}
Num( int n ) {
memset( v, , sizeof(v) );
if( n== ) {
len = ;
return;
}
len = ;
while( n ) {
len++;
v[len] = n%M;
n /= M;
}
}
Num operator+( const Num &b ) const {
Num rt();
rt.len = max( len, b.len ) + ;
for( int i=; i<=rt.len; i++ ) {
rt.v[i] += v[i]+b.v[i];
rt.v[i+] += rt.v[i]/M;
rt.v[i] %= M;
}
while( rt.len> && rt.v[rt.len]== ) rt.len--;
return rt;
}
Num operator-( const Num &b ) const {
Num rt();
rt.len = len;
for( int i=; i<=rt.len; i++ ) {
rt.v[i] += v[i]-b.v[i];
if( rt.v[i]< ) {
rt.v[i]+=M;
rt.v[i+]--;
}
}
while( rt.len> && rt.v[rt.len]== ) rt.len--;
return rt;
}
int count_bit( int b ) const {
int rt = ;
while( b ) {
rt++;
b/=M;
}
return rt;
}
Num operator*( int b ) const {
Num rt();
rt.len = len+count_bit(b)+; // b==3
for( int i=; i<=rt.len; i++ ) {
rt.v[i] += v[i]*b;
rt.v[i+] += rt.v[i]/M;
rt.v[i] %= M;
}
while( rt.len> && rt.v[rt.len]== ) rt.len--;
return rt;
}
void print() {
for( int i=len; i>=; i-- )
printf( "%d", v[i] );
printf( "\n" );
}
}; int n;
Num dp[]; int main() {
scanf( "%d", &n );
dp[] = Num();
dp[] = Num();
for( int i=; i<=n; i++ )
dp[i] = dp[i-]* +Num() - dp[i-];
dp[n].print();
}
——————————————————————————————————————————
去补习了一下python,用python写了一个用辗转相除思想算行列式的算法(感觉python还是挺快的,还有高精度支持)
#!/usr/bin/python from math import * def swap( a, b ):
return b, a
def abs( a ) :
if a<0 :
return -a
else:
return a
def det( a, n ):
for i in range(0,n):
if a[i][i]==0:
return 0
for j in range(i+1,n):
while a[j][i]!=0 :
d = a[i][i]//a[j][i]
for k in range(i,n) :
a[i][k] = a[i][k]-a[j][k]*d
a[j][k],a[i][k] = swap( a[j][k],a[i][k] )
ans = 1
for i in range(0,n):
ans = ans * a[i][i]
return abs(ans) def mod( a, m ):
return (a%m+m)%m def main():
for n in range( 1, 101 ):
if n==1 :
print 1
continue
if n==2 :
print 5
continue i = j = 0
a = [ [ 0 for j in range(n) ] for i in range(n) ]
i = 0
for i in range(0,n):
a[i][i] = 3
a[i][mod(i-1,n)] = -1
a[i][mod(i+1,n)] = -1
print det(a,n)
main()
将文件保存到bzoj1002.py,执行
chmod +x hzoj1002.py
./hzoj1002.py
bzoj1002 生成树计数 找规律的更多相关文章
- bzoj1002 [FJOI2007]轮状病毒——找规律+高精度
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 打表找规律,似乎是这样:https://blog.csdn.net/fzhvampir ...
- BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...
- UVa 12627 (递归 计数 找规律) Erratic Expansion
直接说几个比较明显的规律吧. k个小时以后,红气球的个数为3k. 单独观察一行: 令f(r, k)为k个小时后第r行红气球的个数. 如果r为奇数,f(r, k) = f((r+1)/2, k-1) * ...
- hdu 2865 Polya计数+(矩阵 or 找规律 求C)
Birthday Toy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)
题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...
- bzoj1002: [FJOI2007]轮状病毒 生成树计数
轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规 ...
- bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元
基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1 5 16 45 121 320 841 2205 5776 151 ...
- 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1766 Solved: 946[Submit][Status ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
随机推荐
- ES6基础知识汇总
1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...
- Ubuntu 14.04 64位上安装wps office软件(转http://m.blog.csdn.net/blog/yhc13429826359/24179933)
废话少说,只给出方法供各位参考!wps for Linux版本已经有两三年没有大的动作,当然其他平台,比如windows,Android,ios上的wps效果还是很赞的说. 下面是我成功安装的步骤: ...
- chm转换为html文件
在Windows下chm转换为html的超简单方法(反编译CHM文件的方法) 通过调用Windows命令,将chm 文件转换为html 文件. 方法: 命令行(cmd),输入hh -decompile ...
- Myeclipse编辑jsp文件很卡是什么原因?
可能是配置问题,配置的时候不要把myeclipse连接到网络.否则每次编辑的时候要在网上查找,所以照成很卡.window->perferences->java->Installed ...
- Mybatis的关联映射案例
主要是对之前学习的关联映射做一个案例,自己动手实践一下,可以理解的更好一点. 开发环境 开发工具:idea Java环境: jdk1.8.0_121 数据库:SQLServer 项目结构,里面包含了三 ...
- 安装matplotlib 和Pygal
一. 在Linux系统中安装matplotlib 如果我们使用的是系统自带的Python版本,可使用系统的包管理器来安装matplotlib,为此只需执行一行命令: $ sudo apt-get i ...
- 小甲鱼Python笔记(上)
基于Python 3.4.3 一 二 三 四 基础 print 三版必须加括号,二版不用加 alt + n :上一条语句 alt + p :下一条语句 打印三条hello 没有大括号,用缩进来表示 ...
- Java Hibernate和.Net EntityFramework 如何在提交事务之前 就拿到需要新增实体的Id
在Hibernate中很容易做到这一点,因为hibernate在事务commit之前 还有一个save方法,这个save方法就可以持久化并且拿到Id. 但是EF并不可以呀,EF是将对象标记为新增状态 ...
- MySQL 中的日期时间类型
日期时间类型中包含以下几种数据类型: DATE TIME DATETIME TIMESTAMP YEAR 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0.TIMESTAMP ...
- ArrayList中重复元素处理方法.[Java]
1.使用HashSet删除ArrayList中重复的元素 private static void sortByHashSet() { ArrayList<String> listWithD ...