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 ...
随机推荐
- Impala笔记之通用命令
help help命令用于查询其它命令的用法 [quickstart.cloudera:21000] > help select; Executes a SELECT... query, fet ...
- LOW逼三人组(二)----选择排序算法
选择排序思路: 算法程序: def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper(*args,**kwargs): t1=time.time() re ...
- zepto.js 实现原理解析
zepto 是移动端常用的 dom 库,代码轻巧,操作方式类同 jquery.那么 zepto 的核心实现原理是什么呢?
- 一个爬取https和http通用的工具类(JDK自带的URL的用法)
今天在java爬取天猫的时候因为ssl报错,所以从网上找了一个可以爬取https和http通用的工具类.但是有的时候此工具类爬到的数据不全,此处不得不说python爬虫很厉害. package cn. ...
- http状态码说明
在学习网页设计的时候都应该知道状态码,但我们常见的状态码都是200,404,下面介绍其他的状态值 1开头的http状态码表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者应 ...
- Deep Learning基础--SVD奇异值分解
矩阵奇异值的物理意义是什么?如何更好地理解奇异值分解?下面我们用图片的例子来扼要分析. 矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition ...
- u-boot界面添加命令[demo]
目标板:2440 如何在u-boot界面中增加命令 在/common/目录下建立文件,调用执行函数do_bootm就行,然后在修改Makefile,就OK了. 比如在u-boot界面添加命令test ...
- Guava cache功能简介(转)
原文链接:http://ifeve.com/google-guava-cachesexplained/ 范例 LoadingCache<Key, Graph> graphs = Cache ...
- Maven整合Spring与Solr
首先,在maven的pom.xml文件中配置对spring和solrj客户端的依赖: <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- spring集成swagger
随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远. 前端和后端的唯一联系,变成了API接口:API文档变成了 ...