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

  N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不
同的3轮状病毒,如下图所示

  现给定n(N<=100),编程计算有多少个不同的n轮状病毒
裸的生成树计数,需要高精,同时需要特判2的重边情况

/**************************************************************
Problem: 1002
User: walfy
Language: Java
Result: Accepted
Time:1700 ms
Memory:24832 kb
****************************************************************/ import java.awt.List;
import java.math.BigInteger;
import java.sql.Date;
import java.util.*;
import java.util.Map.Entry; import javax.swing.text.html.HTMLDocument.Iterator; public class Main { static BigInteger [][] A = new BigInteger [100+10][100+10];
static BigInteger [] D = new BigInteger [100+10];
static void cal(int n)
{
BigInteger ans=BigInteger.valueOf(1);
for(int i=1;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
while(!A[j][i].equals(BigInteger.valueOf(0))){
BigInteger t=A[i][i].divide(A[j][i]);
for(int k=i;k<n;k++)
A[i][k]=A[i][k].subtract(A[j][k].multiply(t));
for(int k=i;k<n;k++)
{
BigInteger te=A[i][k];
A[i][k]=A[j][k];
A[j][k]=te;
}
ans=ans.negate();
}
}
if(A[i][i]==BigInteger.valueOf(0))
{
System.out.println(0);
return ;
}
ans=ans.multiply(A[i][i]);
}
if(ans.compareTo(BigInteger.valueOf(0))<0)ans=ans.negate();
System.out.println(ans);
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();n++;
if(n==3)
{
System.out.println("5");
return ;
}
for(int i=1;i<=n;i++)
{
D[i]=BigInteger.valueOf(0);
for(int j=1;j<=n;j++)
A[i][j]=BigInteger.valueOf(0);
}
for(int i=2;i<=n;i++)
{
if(i==n)
{
A[n][2]=BigInteger.valueOf(1);
A[2][n]=BigInteger.valueOf(1);
}
else
{
A[i][i+1]=BigInteger.valueOf(1);
A[i+1][i]=BigInteger.valueOf(1);
}
A[1][i]=BigInteger.valueOf(1);
A[i][1]=BigInteger.valueOf(1);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(A[i][j].compareTo(BigInteger.ZERO)!=0)
{
D[i]=D[i].add(BigInteger.ONE);
D[j]=D[j].add(BigInteger.ONE);
}
}
}
// for(int i=1;i<=n;i++)System.out.println(D[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)A[i][j]=D[i];
else A[i][j]=A[i][j].negate();
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// System.out.print(A[i][j]+" ");
// System.out.println();
// }
cal(n);
}
}

最新文章

  1. jqGrid jqGrid分页参数+条件查询
  2. Hadoop 部署过程中的一些问题与解决方案
  3. CSS3实现开门动画
  4. pyenv的使用
  5. css3之background-clip与background-origin的区别
  6. 不可或缺 Windows Native (1) - C 语言: hello c
  7. MyEclipse安装插件的几种方式(适用于Eclipse或MyEclipse其他版本)
  8. Drawable和Bitmap转换
  9. cojs 安科赛斯特 题解报告
  10. MenuDrawer的使用
  11. keil优化论
  12. HDU 5730 Shell Necklace(CDQ分治+FFT)
  13. android uiautomator自己主动化測试
  14. EasyUi中对话框。
  15. 项目中Orcale存储过程优化记录
  16. Beta冲刺(5/7)
  17. 防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机
  18. 【SpringBoot】常用Starter介绍和整合模板引擎Freemaker、thymeleaf
  19. Navicat工具怎么连接oracle数据库
  20. python进程间通信--信号Signal

热门文章

  1. Mysql Having的用法:对group by之后的分组加限制条件(复制)
  2. 235. Lowest Common Ancestor of a Binary Search Tree(LCA最低公共祖先)
  3. Java Vertor详细介绍和使用示例
  4. linux上使用wget下载文件
  5. JMeter插件管理器
  6. MySQL中exists与in的使用
  7. zookeeper和淘宝dubbo的关系
  8. C#打开文件资源管理器
  9. JAVA面试题整理(4)-Netty
  10. 20145324 Java实验二