HDU 4873 ZCC Loves Intersection

pid=4873" target="_blank" style="">题目链接

题意:d维的。长度为n的块中,每次选d条平行于各条轴的线段,假设有两两相交则点数加1,问每次得到点数的期望是多少

思路:自己推还是差一些,转篇官方题接把,感觉自己想的没想到把分子那项拆分成几个多项式的和,然后能够转化为公式求解。





代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4.  
  5. const int MAXN = 10005;
  6.  
  7. struct bign {
  8. int len, num[MAXN];
  9.  
  10. bign () {
  11. len = 0;
  12. memset(num, 0, sizeof(num));
  13. }
  14. bign (int number) {*this = number;}
  15. bign (const char* number) {*this = number;}
  16.  
  17. void DelZero ();
  18. void Put ();
  19.  
  20. void operator = (int number);
  21. void operator = (char* number);
  22.  
  23. bool operator < (const bign& b) const;
  24. bool operator > (const bign& b) const { return b < *this; }
  25. bool operator <= (const bign& b) const { return !(b < *this); }
  26. bool operator >= (const bign& b) const { return !(*this < b); }
  27. bool operator != (const bign& b) const { return b < *this || *this < b;}
  28. bool operator == (const bign& b) const { return !(b != *this); }
  29.  
  30. void operator ++ ();
  31. void operator -- ();
  32. bign operator + (const int& b);
  33. bign operator + (const bign& b);
  34. bign operator - (const int& b);
  35. bign operator - (const bign& b);
  36. bign operator * (const int& b);
  37. bign operator * (const bign& b);
  38. bign operator / (const int& b);
  39. //bign operator / (const bign& b);
  40. int operator % (const int& b);
  41. };
  42. /***************************************************/
  43.  
  44. const int N = 10005;
  45. long long n, d, prime[N], cnt[N];
  46. int pn = 0, vis[N];
  47. bign zi, mu;
  48.  
  49. void table() {
  50. for (long long i = 2; i < N; i++) {
  51. prime[pn++] = i;
  52. for (long long j = i * i; j < N; j += i)
  53. vis[j] = 1;
  54. }
  55. }
  56.  
  57. bign qpow(long long x, long long k) {
  58. bign ans = 1;
  59. bign tmp = x;
  60. while (k) {
  61. if (k&1) ans = ans * tmp;
  62. tmp = tmp * tmp;
  63. k >>= 1;
  64. }
  65. return ans;
  66. }
  67.  
  68. void solve(long long num, long long val) {
  69. for (int i = 0; i < pn && prime[i] <= num; i++) {
  70. while (num % prime[i] == 0) {
  71. cnt[i] += val;
  72. num /= prime[i];
  73. }
  74. }
  75. if (num != 1) {
  76. if (val > 0)
  77. zi = zi * qpow(num, val);
  78. else if (val < 0)
  79. mu = mu * qpow(num, (-val));
  80. }
  81. }
  82.  
  83. int main() {
  84. table();
  85. while (~scanf("%lld%lld", &n, &d)) {
  86. zi = 1, mu = 1;
  87. memset(cnt, 0, sizeof(cnt));
  88. solve(d * (d - 1) / 2, 1);
  89. solve(n + 4, 2);
  90. solve(3, -2);
  91. solve(n, -d);
  92. for (int i = 0; i < pn; i++) {
  93. if (cnt[i] > 0)
  94. zi = zi * qpow(prime[i], cnt[i]);
  95. else if (cnt[i] < 0)
  96. mu = mu * qpow(prime[i], (-cnt[i]));
  97. }
  98. zi.Put();
  99. if (mu != 1) {
  100. printf("/");
  101. mu.Put();
  102. }
  103. printf("\n");
  104. }
  105. return 0;
  106. }
  107.  
  108. /*********************************************/
  109. void bign::DelZero () {
  110. while (len && num[len-1] == 0)
  111. len--;
  112.  
  113. if (len == 0) {
  114. num[len++] = 0;
  115. }
  116. }
  117.  
  118. void bign::Put () {
  119. for (int i = len-1; i >= 0; i--)
  120. printf("%d", num[i]);
  121. }
  122.  
  123. void bign::operator = (char* number) {
  124. len = strlen (number);
  125. for (int i = 0; i < len; i++)
  126. num[i] = number[len-i-1] - '0';
  127.  
  128. DelZero ();
  129. }
  130.  
  131. void bign::operator = (int number) {
  132.  
  133. len = 0;
  134. while (number) {
  135. num[len++] = number%10;
  136. number /= 10;
  137. }
  138.  
  139. DelZero ();
  140. }
  141.  
  142. bool bign::operator < (const bign& b) const {
  143. if (len != b.len)
  144. return len < b.len;
  145. for (int i = len-1; i >= 0; i--)
  146. if (num[i] != b.num[i])
  147. return num[i] < b.num[i];
  148. return false;
  149. }
  150.  
  151. void bign::operator ++ () {
  152. int s = 1;
  153.  
  154. for (int i = 0; i < len; i++) {
  155. s = s + num[i];
  156. num[i] = s % 10;
  157. s /= 10;
  158. if (!s) break;
  159. }
  160.  
  161. while (s) {
  162. num[len++] = s%10;
  163. s /= 10;
  164. }
  165. }
  166.  
  167. void bign::operator -- () {
  168. if (num[0] == 0 && len == 1) return;
  169.  
  170. int s = -1;
  171. for (int i = 0; i < len; i++) {
  172. s = s + num[i];
  173. num[i] = (s + 10) % 10;
  174. if (s >= 0) break;
  175. }
  176. DelZero ();
  177. }
  178.  
  179. bign bign::operator + (const int& b) {
  180. bign a = b;
  181. return *this + a;
  182. }
  183.  
  184. bign bign::operator + (const bign& b) {
  185. int bignSum = 0;
  186. bign ans;
  187.  
  188. for (int i = 0; i < len || i < b.len; i++) {
  189. if (i < len) bignSum += num[i];
  190. if (i < b.len) bignSum += b.num[i];
  191.  
  192. ans.num[ans.len++] = bignSum % 10;
  193. bignSum /= 10;
  194. }
  195.  
  196. while (bignSum) {
  197. ans.num[ans.len++] = bignSum % 10;
  198. bignSum /= 10;
  199. }
  200.  
  201. return ans;
  202. }
  203.  
  204. bign bign::operator - (const int& b) {
  205. bign a = b;
  206. return *this - a;
  207. }
  208.  
  209. bign bign::operator - (const bign& b) {
  210. int bignSub = 0;
  211. bign ans;
  212. for (int i = 0; i < len || i < b.len; i++) {
  213. bignSub += num[i];
  214. bignSub -= b.num[i];
  215. ans.num[ans.len++] = (bignSub + 10) % 10;
  216. if (bignSub < 0) bignSub = -1;
  217. }
  218. ans.DelZero ();
  219. return ans;
  220. }
  221.  
  222. bign bign::operator * (const int& b) {
  223. long long bignSum = 0;
  224. bign ans;
  225.  
  226. ans.len = len;
  227. for (int i = 0; i < len; i++) {
  228. bignSum += (long long)num[i] * b;
  229. ans.num[i] = bignSum % 10;
  230. bignSum /= 10;
  231. }
  232.  
  233. while (bignSum) {
  234. ans.num[ans.len++] = bignSum % 10;
  235. bignSum /= 10;
  236. }
  237.  
  238. return ans;
  239. }
  240.  
  241. bign bign::operator * (const bign& b) {
  242. bign ans;
  243. ans.len = 0;
  244.  
  245. for (int i = 0; i < len; i++){
  246. int bignSum = 0;
  247.  
  248. for (int j = 0; j < b.len; j++){
  249. bignSum += num[i] * b.num[j] + ans.num[i+j];
  250. ans.num[i+j] = bignSum % 10;
  251. bignSum /= 10;
  252. }
  253. ans.len = i + b.len;
  254.  
  255. while (bignSum){
  256. ans.num[ans.len++] = bignSum % 10;
  257. bignSum /= 10;
  258. }
  259. }
  260. return ans;
  261. }
  262.  
  263. bign bign::operator / (const int& b) {
  264.  
  265. bign ans;
  266.  
  267. int s = 0;
  268. for (int i = len-1; i >= 0; i--) {
  269. s = s * 10 + num[i];
  270. ans.num[i] = s/b;
  271. s %= b;
  272. }
  273.  
  274. ans.len = len;
  275. ans.DelZero ();
  276. return ans;
  277. }
  278.  
  279. int bign::operator % (const int& b) {
  280.  
  281. bign ans;
  282.  
  283. int s = 0;
  284. for (int i = len-1; i >= 0; i--) {
  285. s = s * 10 + num[i];
  286. ans.num[i] = s/b;
  287. s %= b;
  288. }
  289.  
  290. return s;
  291. }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

HDU 4873 ZCC Loves Intersection(可能性)的更多相关文章

  1. hdu 4873 ZCC Loves Intersection(大数+概率)

    pid=4873" target="_blank" style="">题目链接:hdu 4873 ZCC Loves Intersection ...

  2. HDU 4873 ZCC Loves Intersection(JAVA、大数、推公式)

    在一个D维空间,只有整点,点的每个维度的值是0~n-1 .现每秒生成D条线段,第i条线段与第i维度的轴平行.问D条线段的相交期望. 生成线段[a1,a2]的方法(假设该线段为第i条,即与第i维度的轴平 ...

  3. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  4. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  5. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...

  6. HDU 4882 ZCC Loves Codefires (贪心)

    ZCC Loves Codefires 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/B Description Though ...

  7. HDU 4882 ZCC Loves Codefires(贪心)

     ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. hdu 5288 ZCC loves straight flush

    传送门 ZCC loves straight flush Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K ...

  9. HDU 5228 ZCC loves straight flush( BestCoder Round #41)

    题目链接:pid=5228">ZCC loves straight flush pid=5228">题面: pid=5228"> ZCC loves s ...

随机推荐

  1. java提高篇(八)-----实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  2. STL之容器适配器queue的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...

  3. 编hadoop-1.X源代码

    满足需要在不久的将来windows调试Linux下一个hadoop问题,Linux检查时需要的文件权限.和windows在没有必要,因此,有必要修改hadoop源代码,再次编译,过程例如以下: (1) ...

  4. sdut 上机练习8面向对象编程(对象的数组)

    上机练习8面向对象编程(对象的数组) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 利用类对象数组完毕N个学生数据(学号是字符串类型.成绩是整型)的输入 ...

  5. POJ 1631 Bridging signals(LIS 二分法 高速方法)

    Language: Default Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1076 ...

  6. HDU 2203 亲串(kmp)

    Problem Description 随着人们年龄的增长更大,更聪明还是越大越愚蠢,这是一个值,相同的问题Eddy也一直在思考,由于他在非常小的时候就知道亲和串怎样推断了,可是发现,如今长大了却不知 ...

  7. yii组态 redis主从配置(随着代码)

    最近的欲望redis 主从,但yii内建的redis 它不支持主从.不仅写了一个好办法 结构例,以下: 1.main.php通过添加下面的句子: //redis缓存配置 'cache_redis' = ...

  8. 解决win10开机出现C:\WIndows\system32\config\systemprofile\Desktop不可用 问题

    背景:公司一台win10机子好久没用了,今天开了打算用下(打算远程桌面),远程桌面连不上(好久没用了,用户名都忘了),所以又插上显示器和键鼠. 键盘因为是PS/2接口,不能热插拔,所以开机一段时间后( ...

  9. 设计模式之空对象(Null Object)模式

    通过引用Null Object,用于取消业务逻辑中对对象的为空推断 类图: Nullable: package com.demo.user; public interface Nullable { b ...

  10. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...