这道题第一眼是生成树计数,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 生成树计数 找规律的更多相关文章

  1. bzoj1002 [FJOI2007]轮状病毒——找规律+高精度

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 打表找规律,似乎是这样:https://blog.csdn.net/fzhvampir ...

  2. BZOJ1002:[FJOI2007]轮状病毒(找规律,递推)

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

  3. UVa 12627 (递归 计数 找规律) Erratic Expansion

    直接说几个比较明显的规律吧. k个小时以后,红气球的个数为3k. 单独观察一行: 令f(r, k)为k个小时后第r行红气球的个数. 如果r为奇数,f(r, k) = f((r+1)/2, k-1) * ...

  4. hdu 2865 Polya计数+(矩阵 or 找规律 求C)

    Birthday Toy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)

    题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...

  6. bzoj1002: [FJOI2007]轮状病毒 生成树计数

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

  7. bzoj1002 轮状病毒 暴力打标找规律/基尔霍夫矩阵+高斯消元

    基本思路: 1.先观察规律,写写画画未果 2.写程序暴力打表找规律,找出规律 1-15的答案:1    5    16    45    121 320 841     2205   5776 151 ...

  8. 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1766  Solved: 946[Submit][Status ...

  9. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

随机推荐

  1. http://www.onvif.org/onvif/ver20/util/operationIndex.html

    http://www.onvif.org/onvif/ver20/util/operationIndex.html

  2. Centos 6.4搭建git服务器【转】

    前阵子公司需要,让我搭个Git服务器,把之前用的SVN上代码迁移到git上去,所以就在阿里云主机上搭了一个,记录了下安装过程,留存文档以备查阅.本篇本章只涉及搭建部分的操作,更多git的使用可以参考文 ...

  3. juery中监听input的变化事件

    $('#searchValue').bind('input propertychange', function() { searchFundList(); });

  4. 142.Linked List Cycle II---双指针

    题目链接 题目大意:141题目的扩展,给出单链表,判断是否有环,如果有环,找出环的开始的结点,如果没有环,返回null. 法一(借鉴):在已经找出单链表环的基础上再找开始结点,要时刻记住这个环不一定是 ...

  5. django入门--django-blog-zinnia搭建个人博客

    1.安装python 选择合适python2.7及以上版本安装https://www.python.org/downloads/ 2.建立虚拟环境 这不是必须的,但是建议使用,为每个项目单独引入依赖, ...

  6. laravel5.1--数据库操作

    1 配置信息 1.1配置目录: config/database.php 1.2配置多个数据库 //默认的数据库 'mysql' => [ 'driver' => 'mysql', 'hos ...

  7. beego学习笔记(4):开发文档阅读(1)

    1.beego的设计是高度模块化的.每个模块,都可以单独使用.一共八大模块: cache;session;log;orm;context;httplibs;toolbox 2.beego的执行逻辑 3 ...

  8. Java门派的风险

    Java门派的风险 正在看周思博(www.joelonsoftware.com)的新文章.这次是疯狂攻击Java.主要论点是:Java不够难,作为工业语言不错,但作为学校的教学语言,就忒差了.学校应该 ...

  9. PHP 权威代码风格规范

    1.常规 尽量统一ide 比如phpstream 配置文件(Settings → Code Style → PHP → Set from... → Predefined Style → PSR1/PS ...

  10. 七 使用list和tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...