您的位置:首页 > 其它

bzoj 1002[FJOI2007]轮状病毒

2015-04-15 19:58 239 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1002

题解:求给出图的生成树数目

关于生成树数目的计算:http://www.cnblogs.com/shjwudp/articles/4339068.html

这题有很坑,答案会爆longlong,用了java写的

/*
* Problem: BZOJ 1002
* Author:  SHJWUDP
* Created Time:  2015/4/15 星期三 19:24:14
* File Name: Main.java
* State: Accepted
* Memo: Matrix-Tree
*/
import java.util.*;
import java.io.*;
import java.math.*;

public class Main {
public static void main(String args[]) throws IOException {
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);

TaskA solver = new TaskA();
solver.solve(in, out);
out.close();
}
}

class TaskA {
public void solve(InputReader in, PrintWriter out) {
int n=in.nextInt();
if(n<=1) {
out.print(1+"\n");
return ;
}
int[][] D=new int[n+1][n+1];
int[][] A=new int[n+1][n+1];
D

=n;
for(int i=0; i<n; i++) D[i][i]=3;
for(int i=0; i<n; i++) {
A[i]
=A
[i]=1;
int r=(i+1)%n;
A[i][r]=A[r][i]=1;
}

BigInteger[][] C=new BigInteger[n+1][n+1];
for(int i=0; i<=n; i++) {
for(int j=0; j<=n; j++) {
C[i][j]=BigInteger.valueOf(D[i][j]-A[i][j]);
}
}

//计算C的m-1阶行列式 (m=n+1)
BigInteger ans=BigInteger.ONE;
for(int i=0; i<n; i++) {
for(int j=i+1; j<n; j++) while(C[j][i]!=BigInteger.ZERO) {
BigInteger t=C[i][i].divide(C[j][i]);
for(int k=i; k<n; k++) {
C[i][k]=C[i][k].subtract(C[j][k].multiply(t));
}
for(int k=i; k<n; k++) {
BigInteger tmp=C[i][k];
C[i][k]=C[j][k];
C[j][k]=tmp;
}
ans=ans.negate();
}
ans=ans.multiply(C[i][i]);
}
if(ans.compareTo(BigInteger.ZERO)<0) ans=ans.negate();
out.print(ans+"\n");
}
}

class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer;

public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
}

public String next() {
while(tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}

public int nextInt() {
return Integer.parseInt(next());
}

public BigInteger nextBigInt() {
return new BigInteger(next());
}
}


bzoj 1002
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: