这道题第一眼是生成树计数,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. Lithium中关键特性更新

    Lithium中关键特性更新 1. Lithium特性更新概述 Lithium相对于Helium更新特性共27项,其中原有特性提升或增强13项,新增特性14项,如下表所示 特性类型 相对于Helium ...

  2. Attention-over-Attention Neural Networks for Reading Comprehension论文总结

    Attention-over-Attention Neural Networks for Reading Comprehension 论文地址:https://arxiv.org/pdf/1607.0 ...

  3. 64.Minimum Path Sum---dp

    题目链接:https://leetcode.com/problems/minimum-path-sum/description/ 题目大意:从左上到右下的路径中,找出路径和最小的路径(与62,63题相 ...

  4. linux系统磁盘挂载

    1.查看系统磁盘挂载情况 fdisk -l 2.格式化磁盘 mkfs -t ext3 /dev/sdb 3.挂在磁盘 mount /dev/sdb /disk2 4.查看磁盘挂载情况 df -h 5. ...

  5. ssh -o 常用选项

    ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyCheckin ...

  6. ActiveMQ-Network of brokers集群模式

    概述 在ActiveMQ运行过程中,如果发生某个queue只有生产者没有消费者的情况时,消息就会产生积压.Network of brokers模式通过将积压的消息转发给处于同一network的其它br ...

  7. bash: composer: command not found

    下载composer到本地:curl -sS https://getcomposer.org/installer | php 移动至系统服务:sudo mv composer.phar /usr/bi ...

  8. [ python ] 各种推导式

    各种推导式,主要使用示例演示用法 列表生成式 示例1:求0-9每个数的平方 li = [x*x for x in range(10)] print(li) # 执行结果: # [0, 1, 4, 9, ...

  9. 详解Oracle的unlimited tablespace系统权限

    1. 系统权限unlimited tablespace是隐含在dba, resource角色中的一个系统权限. 当用户得到dba或resource的角色时, unlimited tablespace系 ...

  10. 字符串匹配的KMP算法(如何实现还需静下心来细看)

    第一部分:KMP算法的理解(转:http://kb.cnblogs.com/page/176818/) 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB AB ...