HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)
http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11562&courseid=0
求n边形分解成三角形的方案数。
就是求n-2个卡特兰数,从大神那盗取了一份模板,效率极高.同时也很复杂.
- #include <cstdio>
- #include <cmath>
- #include <stdlib.h>
- #include <memory.h>
- typedef int typec;
- typec GCD(typec a, typec b)
- {
- return b? GCD(b, a % b) : a;
- }
- typec extendGCD(typec a, typec b, typec& x, typec& y)
- {
- if(!b) return x = , y = , a;
- typec res = extendGCD(b, a % b, x, y), tmp = x;
- x = y, y = tmp -(a/b)*y;
- return res;
- }
- typec power(typec x, typec k)
- {
- typec res = ;
- while(k)
- {
- if(k&) res *= x;
- x *= x, k >>= ;
- }
- return res;
- }
- typec powerMod(typec x, typec k, typec m)
- {
- typec res = ;
- while(x %= m, k)
- {
- if(k&) res *= x, res %= m;
- x *= x, k >>= ;
- }
- return res;
- }
- typec inverse(typec a, typec p, typec t = )
- {
- typec pt = power(p, t);
- typec x, y;
- y = extendGCD(a, pt, x, y);
- return x < ? x += pt : x;
- }
- typec linearCongruence(typec a, typec b, typec p, typec q)
- {
- typec x, y;
- y = extendGCD(p, q, x, y);
- x *= b - a, x = p * x + a, x %= p * q;
- if(x < ) x += p * q;
- return x;
- }
- const int PRIMEMAX = ;
- int prime[PRIMEMAX + ];
- int getPrime()
- {
- memset(prime, , sizeof(int) * (PRIMEMAX + ));
- for(int i = ; i <= PRIMEMAX; i++)
- {
- if(!prime[i]) prime[++prime[]] = i;
- for(int j = ; j <= prime[] && prime[j] <= PRIMEMAX/i; j++)
- {
- prime[prime[j]*i] = ;
- if(i % prime[j] == ) break;
- }
- }
- return prime[];
- }
- int factor[][], facCnt;
- int getFactors(int x)
- {
- facCnt = ;
- int tmp = x;
- for(int i = ; prime[i] <= tmp / prime[i]; i++)
- {
- factor[facCnt][] = , factor[facCnt][] = ;
- if(tmp % prime[i] == )
- factor[facCnt][] = prime[i];
- while(tmp % prime[i] == )
- factor[facCnt][]++, factor[facCnt][] *= prime[i], tmp /= prime[i];
- if(factor[facCnt][]) facCnt++;
- }
- if(tmp != ) factor[facCnt][] = tmp, factor[facCnt][] = tmp, factor[facCnt++][] = ;
- return facCnt;
- }
- typec combinationModPt(typec n, typec k, typec p, typec t = )
- {
- if(k > n) return ;
- if(n - k < k) k = n - k;
- typec pt = power(p, t);
- typec a = , b = k + , x, y;
- int pcnt = ;
- while(b % p == ) pcnt--, b /= p;
- b %= pt;
- for(int i = ; i <= k; i++)
- {
- x = n - i + , y = i;
- while(x % p == ) pcnt++, x /= p;
- while(y % p == ) pcnt--, y /= p;
- x %= pt, y %= pt, a *= x, b *= y;
- a %= pt, b %= pt;
- }
- if(pcnt >= t) return ;
- extendGCD(b, pt, x, y);
- if(x < ) x += pt;
- a *= x, a %= pt;
- return a * power(p, pcnt) % pt;
- }
- const typec PTMAX = ;
- typec facmod[PTMAX];
- void initFacMod(typec p, typec t = )
- {
- typec pt = power(p, t);
- facmod[] = % pt;
- for(int i = ; i < pt; i++)
- {
- if(i % p) facmod[i] = facmod[i - ] * i % pt;
- else facmod[i] = facmod[i - ];
- }
- }
- typec factorialMod(typec n, typec &pcnt, typec p, typec t = )
- {
- typec pt = power(p, t), res = ;
- typec stepCnt = ;
- while(n)
- {
- res *= facmod[n % pt], res %= pt;
- stepCnt += n /pt, n /= p, pcnt += n;
- }
- res *= powerMod(facmod[pt - ], stepCnt, pt);
- return res %= pt;
- }
- typec combinationModPtFac(typec n, typec k, typec p, typec t = )
- {
- if(k > n || p == ) return ;
- if(n - k < k) k = n - k;
- typec pt = power(p, t), pcnt = , pmcnt = ;
- if(k < pt) return combinationModPt(n, k, p, t);
- initFacMod(p, t);
- typec a = factorialMod(n, pcnt, p, t);
- typec b = factorialMod(k, pmcnt, p, t);
- b *= b, pmcnt <<= , b %= pt;
- typec tmp = k + ;
- while(tmp % p == ) tmp /= p, pmcnt++;
- b *= tmp % pt, b %= pt;
- pcnt -= pmcnt;
- if(pcnt >= t) return ;
- a *= inverse(b, p, t), a %= pt;
- return a * power(p, pcnt) % pt;
- }
- typec combinationModFac(typec n, typec k, typec m)
- {
- getFactors(m);
- typec a, b, p, q;
- for(int i = ; i < facCnt; i++)
- {
- if(!i) a = combinationModPtFac(n, k, factor[i][], factor[i][]), p = factor[i][];
- else b = combinationModPtFac(n, k, factor[i][], factor[i][]), q = factor[i][];
- if(!i) continue;
- a = linearCongruence(a, b, p, q), p *= q;
- }
- return a;
- }
- int main()
- {
- getPrime();
- typec n, k;
- while(scanf("%d %d", &n, &k) != EOF)
- printf("%d\n", combinationModFac( * (n-), n-, k));
- return ;
- }
HUNAN 11562 The Triangle Division of the Convex Polygon(大卡特兰数)的更多相关文章
- HOJ 13101 The Triangle Division of the Convex Polygon(数论求卡特兰数(模不为素数))
The Triangle Division of the Convex Polygon 题意:求 n 凸多边形可以有多少种方法分解成不相交的三角形,最后值模 m. 思路:卡特兰数的例子,只是模 m 让 ...
- HNU 13101 The Triangle Division of the Convex Polygon 组合数的因式分解求法
题意: 求第n-2个Catalan数 模上 m. 思路: Catalan数公式: Catalan[n] = C(n, 2n)/(n+1) = (2n)!/[(n+1)!n!] 因为m是在输入中给的,所 ...
- [LeetCode] Convex Polygon 凸多边形
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- Leetcode: Convex Polygon
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- ACM训练联盟周赛 G. Teemo's convex polygon
65536K Teemo is very interested in convex polygon. There is a convex n-sides polygon, and Teemo co ...
- 【LeetCode】469. Convex Polygon 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算向量夹角 日期 题目地址:https://leet ...
- HDU 5914 Triangle(打表——斐波那契数的应用)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...
- HDU 4195 Regular Convex Polygon
思路:三角形的圆心角可以整除(2*pi)/n #include<cstdio> #include<cstring> #include<iostream> #incl ...
- POJ 3410 Split convex polygon(凸包)
题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...
随机推荐
- github更换仓库
1.找到.git目录 2.打开config文件 3.修改仓库地址 4.重新提交 git push --all origin 这样就替我们的项目换仓啦!!!^_^ 分类: git 参考资料: h ...
- 菜鸟教你如何通俗理解——>集群、负载均衡、分布式
在“高并发,海量数据,分布式,NoSql,云计算......”概念满天飞的年代,相信不少朋友都听说过甚至常与人提起“集群,负载均衡”等,但不是所有人都有机会真正接触到这些技术,也不是所有人都真正理解了 ...
- springboot上传linux文件无法浏览,提示404错误
1.配置文件地址置换 @Componentclass WebConfigurer implements WebMvcConfigurer { @Autowired ConfigUtil bootdoC ...
- 简单的Redis数据迁移
dump迁移 1.安装redis-dump工具 sudo apt-get install ruby rubygems ruby-devel -y gem sources --add http://ge ...
- 【Linux】VirtualBox虚拟网络配置
Host OS : Windows 10 Guest OS : CentOS 6.8 VirtualBox:5.1.18 网络连接方式: NAT 1.CentOS中使用DHCP [root@gouka ...
- Vue—事件修饰符
Vue事件修饰符 Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation(). Vue. ...
- DOM事件模型浅析
1.何为DOM DOM是"Document Object Model"的缩写,中文译为"文档对象模型".它是一种跨平台.跨语言的编程接口,将HTML,XHTML ...
- css3的border-radius属性使用方法
1.border-radius可以包含两个参数值,第一个水平圆角半径,第二个为垂直半径,并且两个参数值用“/”分开. 2.border-radius:设置一个值为四个角都相同,两个值为左上和右下相同, ...
- 我的Python分析成长之路8
Numpy数值计算基础 Numpy:是Numerical Python的简称,它是目前Python数值计算中最为基础的工具包,Numpy是用于数值科学计算的基础模块,不但能够完成科学计算的任而且能够用 ...
- 如何完整反编译AndroidMainfest.xml
下载工具: http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter.zip&can=2&q= 包名为 ...