递推就好了,用二项式定理算出所有连边的方案数,减去不合法的方案,

每次选出一个孤立点,那么对应方案数就是上次的答案。

枚举选几个孤立点和选哪些,选到n-1个点的时候相当于都不选,只减1。

要用到高精度,直接开100*100的组合数数组会MLE,用滚动数组优化一下就好了。

不会java,python太伤了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = ;
  5. struct bign
  6. {
  7. int len, s[MAXN];
  8. bign ()
  9. {
  10. memset(s, , sizeof(s));
  11. len = ;
  12. }
  13. bign (int num) { *this = num; }
  14. bign (const char *num) { *this = num; }
  15. bign operator = (const int num)
  16. {
  17. char s[MAXN];
  18. sprintf(s, "%d", num);
  19. *this = s;
  20. return *this;
  21. }
  22. bign operator = (const char *num)
  23. {
  24. for(int i = ; num[i] == ''; num++) ;
  25. len = strlen(num);
  26. for(int i = ; i < len; i++) s[i] = num[len-i-] - '';
  27. return *this;
  28. }
  29. bign operator + (const bign &b) const
  30. {
  31. bign c;
  32. c.len = ;
  33. for(int i = , g = ; g || i < max(len, b.len); i++)
  34. {
  35. int x = g;
  36. if(i < len) x += s[i];
  37. if(i < b.len) x += b.s[i];
  38. c.s[c.len++] = x % ;
  39. g = x / ;
  40. }
  41. return c;
  42. }
  43. bign operator += (const bign &b)
  44. {
  45. *this = *this + b;
  46. return *this;
  47. }
  48. void clean()
  49. {
  50. while(len > && !s[len-]) len--;
  51. }
  52. bign operator * (const bign &b)
  53. {
  54. bign c;
  55. c.len = len + b.len;
  56. for(int i = ; i < len; i++)
  57. {
  58. for(int j = ; j < b.len; j++)
  59. {
  60. c.s[i+j] += s[i] * b.s[j];
  61. }
  62. }
  63. for(int i = ; i < c.len; i++)
  64. {
  65. c.s[i+] += c.s[i]/;
  66. c.s[i] %= ;
  67. }
  68. c.clean();
  69. return c;
  70. }
  71. bign operator *= (const bign &b)
  72. {
  73. *this = *this * b;
  74. return *this;
  75. }
  76. bign operator - (const bign &b)
  77. {
  78. bign c;
  79. c.len = ;
  80. for(int i = , g = ; i < len; i++)
  81. {
  82. int x = s[i] - g;
  83. if(i < b.len) x -= b.s[i];
  84. if(x >= ) g = ;
  85. else
  86. {
  87. g = ;
  88. x += ;
  89. }
  90. c.s[c.len++] = x;
  91. }
  92. c.clean();
  93. return c;
  94. }
  95. bign operator -= (const bign &b)
  96. {
  97. *this = *this - b;
  98. return *this;
  99. }
  100. bign operator / (const bign &b)
  101. {
  102. bign c, f = ;
  103. for(int i = len-; i >= ; i--)
  104. {
  105. f = f*;
  106. f.s[] = s[i];
  107. while(f >= b)
  108. {
  109. f -= b;
  110. c.s[i]++;
  111. }
  112. }
  113. c.len = len;
  114. c.clean();
  115. return c;
  116. }
  117. bign operator /= (const bign &b)
  118. {
  119. *this = *this / b;
  120. return *this;
  121. }
  122. bign operator % (const bign &b)
  123. {
  124. bign r = *this / b;
  125. r = *this - r*b;
  126. return r;
  127. }
  128. bign operator %= (const bign &b)
  129. {
  130. *this = *this % b;
  131. return *this;
  132. }
  133. bool operator < (const bign &b)
  134. {
  135. if(len != b.len) return len < b.len;
  136. for(int i = len-; i >= ; i--)
  137. {
  138. if(s[i] != b.s[i]) return s[i] < b.s[i];
  139. }
  140. return false;
  141. }
  142. bool operator > (const bign &b)
  143. {
  144. if(len != b.len) return len > b.len;
  145. for(int i = len-; i >= ; i--)
  146. {
  147. if(s[i] != b.s[i]) return s[i] > b.s[i];
  148. }
  149. return false;
  150. }
  151. bool operator == (const bign &b)
  152. {
  153. return !(*this > b) && !(*this < b);
  154. }
  155. bool operator != (const bign &b)
  156. {
  157. return !(*this == b);
  158. }
  159. bool operator <= (const bign &b)
  160. {
  161. return *this < b || *this == b;
  162. }
  163. bool operator >= (const bign &b)
  164. {
  165. return *this > b || *this == b;
  166. }
  167. string str() const
  168. {
  169. string res = "";
  170. for(int i = ; i < len; i++) res = char(s[i]+'') + res;
  171. return res;
  172. }
  173. };
  174. istream& operator >> (istream &in, bign &x)
  175. {
  176. string s;
  177. in >> s;
  178. x = s.c_str();
  179. return in;
  180. }
  181. ostream& operator << (ostream &out, const bign &x)
  182. {
  183. out << x.str();
  184. return out;
  185. }
  186.  
  187. bign fpow(bign a,int b)
  188. {
  189. bign ret = ;
  190. while(b){
  191. if(b&) ret *= a;
  192. a *= a;
  193. b >>= ;
  194. }
  195. return ret;
  196. }
  197. const int maxn = ;
  198. bign tab[maxn];
  199.  
  200. //typedef long long ll;
  201. bign C[][maxn];
  202.  
  203. int main()
  204. {
  205. freopen("trains.in","r",stdin);
  206. freopen("trains.out","w",stdout);
  207. tab[] = ;
  208. int n;
  209. scanf("%d",&n);
  210. C[&][] = C[&][] = ;
  211. for(int i = ; i <= n; i++){
  212. bign Full = fpow(,i*(i-)/);
  213. int pre = i&,cur = pre^;
  214. C[cur][] = ;
  215. for(int j = ; j <= i; j++) C[cur][j] = C[pre][j-] + C[pre][j];
  216.  
  217. for(int j = ; j < i; j++){
  218. Full -= tab[j]*C[cur][j];
  219. }
  220. tab[i] = Full - ;
  221. }
  222. cout<<tab[n]<<endl;
  223. return ;
  224. }

codeforces Gym 100338H High Speed Trains (递推,高精度)的更多相关文章

  1. Codeforces Gym 100338H High Speed Trains 组合数学+dp+高精度

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  2. PKU 2506 Tiling(递推+高精度||string应用)

    题目大意:原题链接有2×1和2×2两种规格的地板,现要拼2×n的形状,共有多少种情况,首先要做这道题目要先对递推有一定的了解.解题思路:1.假设我们已经铺好了2×(n-1)的情形,则要铺到2×n则只能 ...

  3. 递推+高精度+找规律 UVA 10254 The Priest Mathematician

    题目传送门 /* 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子 ...

  4. [luogu]P1066 2^k进制数[数学][递推][高精度]

    [luogu]P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻 ...

  5. CodeForces 429 B Working out(递推dp)

    题目连接:B. Working out 我想了很久都没有想到怎么递推,看了题解后试着自己写,结果第二组数据就 wa 了,后来才知道自己没有判选择的两条路径是否只是一个交点. 大概思路是:先预处理出每个 ...

  6. Codeforces Round #271 (Div. 2)D(递推,前缀和)

    很简单的递推题.d[n]=d[n-1]+d[n-k] 注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时. 所以用预处理前缀和来解决重复累加问题. 最后一个细节坑了我多次: print ...

  7. [BZOJ1089][SCOI2003]严格n元树(递推+高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1089 分析: 第一感觉可以用一个通式求出来,但是考虑一下很麻烦,不好搞的.很容易发现最 ...

  8. 【BZOJ】1089: [SCOI2003]严格n元树(递推+高精度/fft)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1089 题意:求深度为d的n元树数目.(0<n<=32, 0<=d<=16) ...

  9. 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度

    1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...

随机推荐

  1. 1.11-1.12 Sqoop导入数据时两种增量方式导入及direct

    一.增量数据的导入 1.两种方式 ## query 有一个唯一标识符,通常这个表都有一个字段,类似于插入时间createtime where createtime => 201509240000 ...

  2. Validtion

    今天在使用Validation框架实现验证时,出现以上的错误.查询资料后发现“validation-config.dtd”这个文件没有导入自己的工程,才会出现这样的错误. 将从文件导入后果然解决了问题 ...

  3. u3d shader学习笔记1

    促使我学习SHADER的重要原因是希望深入理解3D渲染的机制,在此基础上可以灵活达到某种效果与性能的平衡,开发出具有良好体验的VR应用. 因为VR应用体验的好坏,直接由游戏的帧率决定,而游戏的帧率则受 ...

  4. sfc命令

    开始—>运行—>再输入“sfc /scannow”(不含引号),“sfc”是“系统文件检测”程序,它是一个在命令提示符下使用的实用程序,只有是管理员才能使用该程序,这个程序的作用就是检测系 ...

  5. 安装APK时SO库的选择策略

    此文已由作者尹彬彬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 0X0 前言 在Android系统中,当我们安装apk文件的时候,lib目录下的so文件会被解压到app的原 ...

  6. IOS Carthage安装、使用

    一.Carthage的安装和使用1.安装homebrew后输入如下命令 $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercont ...

  7. P5135 painting(组合数)

    传送门 如果\(op==1\),那么每一个方案都可以看做从\(n\)个数里选出\(m\)个数,然后\(sort\)一下依次放到每列,方案数就是\({n\choose m}\).因为\(n\)很大,但是 ...

  8. [Xcode 实际操作]一、博主领进门-(2)第一个工程项目:将导入的图片显示到屏幕上

    目录:[Swift]Xcode实际操作 本文将演示创建第一个工程项目. 在项目导航区,鼠标右键[Assets.xcassets]资源文件夹. 隔壁右侧区域左下角点击[+],打开资源文件管理菜单-> ...

  9. pytest入门学习(2)

    pytest的hello world pyt1.py def func(x): print (x+1); return x+1; def test_answer(): assert func(3) = ...

  10. C#求圆的周长、面积、体积

    窗体应用程序 private void button1_Click(object sender, EventArgs e) { double r; r = Convert.ToInt32(textBo ...