ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)

Description

In graph theory, a matching or independent edge set in a graph G = (V , E) is a set of edges ME such that no two edges in the matching M share a common vertex.

The Nobel Prize in XiXiHaHa was awarded to Jerryxf team, amongst other things, their algorithm for finding a matching satisfying certain criteria in a bipartite graph. Since you have also heard that matchings in cycle graphs have applications in chemistry your thoughts centre around a plan for a beautiful future where your Christmas shopping is more luxurious than ever!

The cycle graph, Cn, n≥3, is a simple undirected graph, on vertex set {1,……, n}, with edge set E(Cn) = {{a , b}  |  |a-b| ≡ 1 mod mod n }. It is 2-regular, and contains n edges. The graphs C3, C4, C5, and C6 are depicted in Figure 1.

Your first step towards Nobel Prize fame is to be able to compute the number of matchings in the cycle graph Cn. In Figure 2 the seven matchings of the graph C4 are depicted.

Figure 2: The matchings of C4. The edges that are part of the respective matching are coloured green, while the edges left out of the matching are dashed. M1 =  ,  M2 = {{2 ,1}} , M3={{3 , 2}} ,  M4 ={{4 , 3}}, M5 = {{1 , 4}}, M6 = {{2 , 1},{4 , 3}}, and M7 = {{3 , 2},{1 , 4}}

Input

For each test case, you get a single line containing one positive integer: n, with 3≤n≤10000.

Output

For each test case, a row containing the number of matchings in Cn.

Sample Input

3
4
100

Sample Output

4
7
792070839848372253127

题目意思就是在一个环上放线段,线段不能相邻,求放法数。

这是一个典型的组合类型问题,不过圆形的排列不太好搞。

我们考虑直链型的:对于直链型的,不妨设f(n)表示以n结尾的直链型的方法数。

考虑n处不放线段,那么去掉n,剩下(n-1)个就变成了子问题f(n-1);

考虑n处放线段,那么n-1处必然不能放,于是剩下的(n-2)个就变成了子问题f(n-2);

于是对于直链的:f(n) = f(n-1) + f(n-2),正好是一个费波拉契数列。

于是对于圆形排列的就好考虑了:不妨设s(n)表示n个的圆形排列的数目。

考虑第n个不放线段,那么剩余的(n-1)变可以从第n个那处展开成直链的f(n-1);

考虑第n个放线段,那么第1个和第n-1个必然不能放,那么剩下n-3个便是直链的f(n-3)

于是s(n) = f(n-1) + f(n-3),理论上到此处变可以求s(n)了,首先对f(n)将前10000项打表,然后就可以求任意s(n)(注意f(0) = 1, f(1) = 2)

不过由于s(n) = f(n-1) + f(n-3), 自然s(n) = s(n-1) + s(n-2),其本身也是费波拉契数列。

由于此处需要考虑大数,故采用了Java的大数类。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main
{
    public static void main(String args[])
    {
        BigInteger f[] = new BigInteger[10001];
        f[0] = new BigInteger("1");
        f[1] = new BigInteger("2");
        for (int i = 2; i <= 10000; ++i)
        {
            f[i] = new BigInteger("0");
            f[i] = f[i-1].add(f[i-2]);
        }
        Scanner input = new Scanner(System.in);
        int n;
        while (input.hasNext())
        {
            n = input.nextInt();
            System.out.println(f[n-1].add(f[n-3]));
        }
    }
}
时间: 2024-08-02 02:51:20

ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)的相关文章

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(随机数-水题)[Hobo]

C - 随机数 Time Limit: 1000 ms        Memory Limit: 65536 KB Submit Description 开学了,ACM队的边老板想在学校中请一些妹子一起做一项问卷调查,调查妹子们对ACM的了解情况,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的妹子的编号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.老板怎么会自己去解决这么简单

NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m.但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应).但是,如果不存在带电脑并还没和别人公用的人,那他就要等了,等是很让人头疼的,这就不和谐了,当然假如没有这样的情况发生比赛是很和谐的. Input 输入多组数据,每组数据只有一行m(

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(和谐的比赛-dp寻路)

F - 和谐的比赛 Time Limit: 3000 ms        Memory Limit: 10240 KB Submit Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m.但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应).但是,如果不存在带电脑并还没和别人公用的人,那

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(忙碌的选课系统-拓扑排序注意重边)

D - 忙碌的选课系统 Time Limit: 10000 ms        Memory Limit: 65536 KB Submit Description 每学期末,都是万众瞩目的选课时间,由于人数过多,某学校的服务器常常被无数的学生挤的爆掉,这是,教务系统大人说,你们选个课都这么慢,居然还怪我们.于是,每次教务系统都会在服务器快要瘫痪前关闭它.在无数学生的强烈抗议下,教务系统妥协了,再给每个人一次机会,但他让我们用最快的方式决定该选的课程,选上后就退出. 这让大一学渣狗犯了难,在新的选

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(约翰&#183;亨利-dp)

H - 约翰·亨利 Time Limit: 1000 ms        Memory Limit: 32768 KB Submit Description 十九世纪,铁路开始将美国各大州连接起来.铁路使得人们在不到一周内从国家的这一头旅行到另一头变成现实.在这之前,同样的旅程要花上六个月的时间. 一天,一个商人带着一种用蒸汽驱动的新型钻机来到工地.他说这种机械钻孔速度比十二个工人同时作业还要快.如果这种机器真的像商人所说的那么好,那么铁路公司打算购买它.力大无穷的刚钻工约翰·亨利看着这台机器,

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(小女警的异世界之战-前序中序求后序)

A - 小女警的异世界之战 Time Limit: 1000 ms        Memory Limit: 65536 KB Submit Description 这一天,小女警花花,泡泡和毛毛来到终极Boss"Him"所在的异世界并准备与其决一死战,却被困在了他的城堡里.她们发现异世界是一个巨大的城堡.城堡由一个个大小不同的房间组成,房间有着以下的规则: 每个房间有且仅有一扇黄门,此外至多有一扇红门和一扇绿门:黄色代表通向更大的房间,绿色和红色代表通向更小的房间.很显然,如果你打开

ACM学习历程—BestCoder 2015百度之星资格赛1001 大搬家(递推 &amp;&amp; 组合数学)

Problem Description 近期B厂组织了一次大搬家,所有人都要按照指示换到指定的座位上.指示的内容是坐在位置i 上的人要搬到位置j 上.现在B厂有N 个人,一对一到N 个位置上.搬家之后也是一一对应的,改变的只有位次. 在第一次搬家后,度度熊由于疏忽,又要求大家按照原指示进行了一次搬家.于是,机智的它想到:再按这个指示搬一次家不就可以恢复第一次搬家的样子了.于是,B厂史无前例的进行了连续三次搬家. 虽然我们都知道度度熊的“机智”常常令人堪忧,但是不可思议的是,这回真的应验了.第三次

ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)

Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置任何字符,完成后按列读取即成密文. 比如: 原文:123456789 密钥:4 变换后的矩阵: 1234 5678 9xxx (最后的几个x表示无任何字符,不是空格,不是制表符,就没有任何字符,下同) 密文:159263748 再比如: 原文:Hello, welcome to my dream w

ACM学习历程—BestCoder 2015百度之星资格赛1003 IP聚合(set容器)

Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址.网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如: 子网掩码:A.B.C.D IP 地址:a.b.c.d 网络地址:(A&a).(B&b).(C&c).(D&d) Input 第一行包含一个整数T ,(1≤T≤50) 代表测试数据的组数, 接下来T 组测试数据.每组