// uva 11174 Stand in a Line // // 题目大意: // // 村子有n个村民,有多少种方法,使村民排成一条线 // 使得没有人站在他父亲的前面. // // 解题思路: // // 换成模型,先将森林变成一棵树,这样就直观多了,对于 // 一个节点,他的子节点排列时没有任何要求,而子排列中会有 // 限制,将这些限制先提取出来,就可以将所有的视为相同的了, // 然后就是有重复元素的全排列问题.设s(i)为以i节点为根的子树 // f(i)为以i为根的子树的排法,…
这两个题的模型是有n个人,有若干的关系表示谁是谁的父亲,让他们进行排队,且父亲必须排在儿子前面(不一定相邻).求排列数. 我们假设s[i]是i这个节点,他们一家子的总个数(或者换句话说,等于他的子孙数+1(1是他本身)),f[i]是以i为根的节点的排列种数.那么总的种数为n!/(s[1]+s[2]+...+s[n]).关于这个递推式的得出,是根据排列公式的,我们假设一个例子,不妨设4.5是2的子孙,3是1的子孙.那么他们进行排队的话,不妨看成222和11排队就是2的家族和1的家族排队(2和1是平…
UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘   即是答案 当然由于有MOD 要求逆. #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef long long ll; const int N = 40005; const ll MOD = 1e9+7; int n,…
http://blog.csdn.net/u011915301/article/details/43883039 依旧是<训练指南>上的一道例题.书上讲的比较抽象,下面就把解法具体一下.因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林.接下来将使用递归的手法.设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树.s[i]为树根为i的子树包含的节点数.如果分别先给各个子树内部排序,那么毫无疑问, 共有f(c1)*f(c2)*f(c3)…
UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子结点构成的子树看成无序状态,这样子对当前父节点整棵树计算一个排列数.如果把所有的这样的式子写出来,可以发现分子分母是可以相消的.假设点的总数是S,儿子的点的数目分别是A,B,C...,这样的话,对于这个结点,可以求得F(S)=F(A)+F(B)+F(C)+....最后的结果是所有子树的F(S)*F(…
题意:村子里有n个人,给出父亲和儿子的关系,有多少种方式可以把他们排成一列,使得没人会排在他父亲的前面 思路:设f[i]表示以i为根的子树有f[i]种排法,节点i的各个子树的根节点,即它的儿子为c1,c2,c3...ck. 那么先给节点i的子树确定各自的顺序,为f(c1),f(c2)...f(ck). 然后把每棵子树的所有节点看成同一元素,根据有重复元素的全排列方式共有s(i-1)!/(s(c1)!*s(c2)!*...*s(ck)!) 再根据乘法原理,f[i]=f(c1)* f(c2) *f(…
主题链接:点击打开链接 题意:白书的P103. 加个虚根就能够了...然后就是一个多重集排列. import java.io.PrintWriter; import java.util.ArrayList; import java.util.Scanner; public class Main { static int N = 40100; ArrayList<Integer>[] G = new ArrayList[N]; static long mod = 1000000007; long…
题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][0]$ $f[i][1]=2*f[i-1][0]+f[i-1][1]$ $f]i][2]=f[i-1][2]+f[i-2][2]+f[i-2][1]$ 通过递推式子求出一个$6*6$的矩阵然后用矩阵乘法优化递推即可. #include<set> #include<map> #inclu…
题目传送门 /* 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子,2 ^ (n - k) - 1 所以f[n] = min (f[k] * 2 + g[n-k]),n<=10000,所要要用高精度,另外打表能看出规律 */ /************************************************ * Author :Running_Ti…
Problem J Stand in a Line Input: Standard Input Output: Standard Output All the people in the byteland want to stand in a line in such a way that no person stands closer to the front of the line than his father. You are given the information about th…
A. On The Way to Lucky Plaza time limit per test 1.0 s memory limit per test 256 MB input standard input output standard output Alaa is on her last day in Singapore, she wants to buy some presents to her family and friends. Alaa knows that the best p…
题意: 有n个人排队,要求每个人不能排在自己父亲的前面(如果有的话),求所有的排队方案数模1e9+7的值. 分析: <训练指南>上分析得挺清楚的,把公式贴一下吧: 设f(i)为以i为根节点的子树的排列方法,s(i)表示以i为根的子树的节点总数. f(i) = f(c1)f(c2)...f(ck)×(s(i)-1)!/(s(c1)!s(c2)!...s(ck)!) 按照书上最开始举的例子,其实这个式子也不难理解,就是先给这些子树确定一下位置,即有重元素的全排列. 子树的位置确定好以后,然后再确定…
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d      C D   =   c*A+d*C  c*A+d*C 上代码 struct matrix { ll a[maxn][maxn]; }; matrix matrix_mul(matrix x,matrix y) { matrix temp; ;i<=n;i++) ;j<=n;j++) { tem…
Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每天每个该细胞可以分裂出 x − 1 个新的细胞. 小 X 决定第 i 天向培养皿中加入 i 个细胞(在实验开始前培养皿中无细胞). 现在他想知道第 n 天培养皿中总共会有多少个细胞. 由于细胞总数可能很多,你只要告诉他总数对 w 取模的值即可. Input 第一行三个正整数 n, x,w Outpu…
到国庆假期都是复习阶段..所以把一些东西整理重温一下. gcd(a,p)=1,ax≡1(%p),则x为a的逆元.注意前提:gcd(a,p)=1; 方法一:拓展欧几里得 gcd(a,p)=1,ax≡1(%p),转化为ax+py≡1,拓展欧几里得可解决ax+by=gcd(a,b) void exgcd(int a,int b,int &x,int &y) { ) { x=,y=; return a; } int g=exgcd(b,a%b,x,y); int t=x;x=y;y=t-(a/b)…
2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] Description Input 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长.p=0表示输入结束,你的程序不应当处理这一行. Output 对于每组数据,输出仅一行,即满足条件的战场总数除以987654321的余数. Sample I…
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 175  Solved: 85[Submit][Status][Discuss] Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n,k表示初始元素数量和操作数,第二行包含n个整数表示初始时可重集的元素. 对于100…
题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .…
题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^9)\] 一般的递推是O(n)的,显然时间和空间都不能承受. 由于每一步递推都是相同的.这句话包含了2个层面:首先,递推式是相同的:其次,递推的条件也要是相同的.综合来说,每一步的递推都是相同的.这是应用矩阵加速递推的充分条件. 那么怎么进行矩阵加速呢?我们首先观察,第\(i\)项和哪些项有关? 与…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3185 题意: A.B两人赛马,最终名次有3种可能:并列第一:A第一B第二:B第一A第二.输入n(1≤n≤1000),求n人赛马时最终名次的可能性的个数除以10056的余数. 分析: 设答案为f(n).假设第一名有i个人,有C(n,i)种可能性,接下来有f(n-i)种可能性,因此答案…
历史性的时刻!!! 推了一晚上!和hyc一起萌萌哒地推出来了!! 被摧残蹂躏的智商啊!!! 然而炒鸡高兴!! (请不要介意蒟蒻的内心独白..) 设a[i]为扫到第i行时的方案数. 易知,对于一行1*4的格子,只有一种方案把它铺满. 首先,对于当前的第i行,如果它不和第i-1行有联系(也就是它是独立的一行),那么就有1*a[i-1]=a[i-1]种方案. 如果第i行和第i-1行有联系(2行间互相联系),那么共有一下四种方案: 如果第i行.第i-1行.第i-2行都有联系(3行间两两联系),那么共有两…
UVA 11077 - Find the Permutations option=com_onlinejudge&Itemid=8&page=show_problem&category=485&problem=2018&mosmsg=Submission+received+with+ID+13900478" target="_blank" style="">题目链接 题意:给定n,k求出有多少个包括元素[1-n…
Description Assuming a finite – radius “ball” which is on an N dimension is cut with a “knife” of N-1 dimension. How many pieces will the “ball” be cut into most?However, it’s impossible to understand the following statement without any explanation.L…
UVA 1541 - To Bet or Not To Bet 题目链接 题意:这题题意真是神了- -.看半天,大概是玩一个游戏,開始在位置0.终点在位置m + 1,每次扔一个硬币,正面走一步,反面走两步,走到的步上有4种情况: 1.向前走n步 2.向后走n步 3.停止一回合 4.无影响 问能在t次机会内,走到终点m + 1(假设跃过也算走到了)的概率.大于0.5.等于0.5,小于0.5相应不同输出 思路:题意懂了就好办了.事实上就是递推就能够了dp[i][j]表示第i次机会,落在j步的概率.然…
要点: 1.期望的套路,要求n以上的期望,则设dp[i]为i分距离终点的期望步数,则终点dp值为0,答案是dp[0]. 2.此题主要在于数学推导,一方面是要写出dp[i] = 什么,虽然一大串但是思维上并不难:然后就是一种解方程的方法,因为都跟dp[0]有关,且dp[0]是个确定的常数,所以设dp[i] = A[i] * dp[0] + B[i],带入上面那一串解出A[i].B[i],发现是个递推式,于是递推求出A[i]B[i]即可得到dp[0] = B[0] / (1 - A[0]).推荐邝斌…
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&problem=1229&mosmsg=Submission+received+with+ID+13896541" target="_blank" style="">题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有全部的票的期…
题目传送门 /* 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 到达边界后把沿途路上的权值相加求和使最大 DP:这是道递推题,首先我题目看了老半天,看懂后写出前缀和又不知道该如何定义状态好,写不出状态转移方程,太弱了. dp[i][j]表示以(i, j)为右下角时求得的最大值,状态转移方程:dp[i][j] = max (dp[i-1][j] + sum1[i][j], dp[i][j-1] + sum2[i][j]); sum1表示列的…
题目大意:用k种字符构建两个长度为n的字符串(每种字符有无限多个),要求对应位置字符相同的连续子串最长长度为m,问方法数. 其中k,n,m是输入,n(1<=n<=1000000000), m(1<=m<=10), k(1<=k<=26). 对题目解释更详细点儿,如下两串 123456 223466 这个的“对应位置字符相同的连续子串最长长度”是3,是字符串“234”. 解题思路,这题一看就是DP或者组合数学,但是不会组合数学,只能DP了dp[i][j]表示前i个字符,最…
Description 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+-+An*F(1) F(n+2)=A1*F(n+1)+A2*F(n)+-+An*F(2) - 求第K项的值对1000000007取模的结果 Input 单组测试数据 第一行输入两个整数 n , k (1<=n<=100,n < k<=10000000000) 第二行输入 n 个整数 F(1) F(2) - F(n) 第三行输入 n 个整数A1 A2 - An Output 输出一个整数 Sa…
题目:UVA - 590Always on the run(递推) 题目大意:有一个小偷如今在计划着逃跑的路线,可是又想省机票费. 他刚開始在城市1,必须K天都在这N个城市里跑来跑去.最后一天达到城市N.问如何计划路线的得到最少的费用. 解题思路:一開始题目意思就理解有些问题. dp[k][i]:代表在第k天小偷从某一个城市(除了i)坐飞机飞到城市i(到达城市i也是在这一天). 第k天的话,就看这一天坐哪个航班,加上之前的费用是最小的,就选这个方法. 然后k+ 1天就又是由第k天推出来的. 状态…