http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51196

紫书P320;

题意:给定n个数a1,a2····an,依次求出相邻两个数值和,将得到一个新数列,重复上述操作,最后结果将变为一个数,问这个数除以m的余数与那些数无关?例如n=3,m=2时,第一次得到a1+a2,a2+a3,在求和得到a1+2*a2+a3,它除以2的余数和a2无关。1=<n<=10^5, 2=<m<=10^9

其实就是杨辉三角的某一行有几个能整除m,求C(0,n - 1),C(1, n - 2)... C(n - 1, n - 1)中那几个能整除m

解题思路:

1、首先我们可以发现对于给定的n其实每项的系数就是C(n-1,i-1),所以我们只需要找到每项的系数对m取余是否为0即可

2、由于m的取值范围为10^9,所以我们只需要筛选 √(10^9)的素数,然后对m进行分解;如果分解后m>1,说明当前m的是原m的一个素数,而且m> √(10^9),因此我们只需记录它即可

3、由组合数的递推公式C(k, n) = (n - k + 1) / k * C(k - 1, n),而这道题n = n - 1;首项是一,可以直接从第二项即k = 1: (n - 1 )  - k + 1 / k开始判断是否能整除m,分子能整除素数元素个数就减一,分母能整除就+1,如果对于任意一个素数对应的指数 >= 1,就说明不能整除

收获:

每个整数的唯一分解式项数不多(long long 类型的数值最多20项,前21个素数相乘long long就溢出了)

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6. const int Max = ;
  7.  
  8. int factor[],nfactor[],num_factor,flag_factor[ + ];
  9. int count_prime,prime[Max + ],flag[Max + ];
  10. void get_prime()
  11. {
  12. memset(flag, , sizeof(flag));
  13. count_prime = ;
  14. for(int i = ; i <= Max; i++)
  15. {
  16. if(flag[i] == )
  17. {
  18. flag[i] = ;
  19. prime[++count_prime] = i;
  20. for(int j = ; j <= Max / i; j++)
  21. {
  22. flag[i * j] = ;
  23. }
  24. }
  25. }
  26. }
  27.  
  28. void get_factor(int m)
  29. {
  30. num_factor = ;
  31. memset(nfactor, , sizeof(nfactor));
  32. memset(factor, , sizeof(factor));
  33. for(int i = ; i <= count_prime; i++)
  34. {
  35. if(m < prime[i])
  36. break;
  37. if(m % prime[i] == )
  38. {
  39. factor[num_factor] = prime[i];
  40. while(m % prime[i] == && m)
  41. {
  42. nfactor[num_factor]++;
  43. m = m / prime[i];
  44. }
  45. num_factor++;
  46. if(m == || m == )
  47. break;
  48. }
  49. }
  50. if(m > )
  51. {
  52. factor[num_factor] = m;
  53. nfactor[num_factor]++;
  54. num_factor++;
  55. }
  56. }
  57. bool check(int x, int y)
  58. {
  59. bool check_flag = true;
  60. for(int i = ; i < num_factor; i++)
  61. {
  62. while(x % factor[i] == && x)
  63. {
  64. x = x / factor[i];
  65. nfactor[i]--;
  66. }
  67. while(y % factor[i] == && y)
  68. {
  69. y = y / factor[i];
  70. nfactor[i]++;
  71. }
  72. if(nfactor[i] >= )
  73. {
  74. check_flag = false;
  75. //break; 要不得,即使不能整除,也要约分完,因为下一个受这一个的影响
  76. }
  77. }
  78. return check_flag;
  79. }
  80. int main()
  81. {
  82. int n,m;
  83. get_prime();
  84. while(scanf("%d%d", &n, &m) != EOF)
  85. {
  86. get_factor(m); //对m分解
  87. int cnt = , ends = ;
  88. memset(flag_factor, , sizeof(flag_factor));
  89. for(int i = ; i <= n; i++)
  90. {
  91. if( check(n - i, i) ) //原型就是 (n - 1 - i + 1) / i
  92. {
  93. flag_factor[i + ] = ;
  94. ends = i + ;
  95. cnt++;
  96. }
  97. }
  98. printf("%d\n", cnt);
  99. if(cnt > )
  100. {
  101. for(int i = ; i < ends; i++)
  102. if(flag_factor[i])
  103. printf("%d ", i);
  104. printf("%d", ends);
  105. }
  106. printf("\n");
  107. }
  108. return ;
  109. }

UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)的更多相关文章

  1. UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理

    题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...

  2. 【UVa1635】Irrelevant Elements - 唯一分解定理

    题意 给你 \(n\) 个数,每次求出相邻两个数的和组成新数列.经过 \(n-1\) 次操作后,得到一个数.求这个数 \(mod \ m\) 与哪些项无关. 如:当 \(m=2 \ , \ n=2\) ...

  3. POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]

    Irrelevant Elements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2407   Accepted: 59 ...

  4. hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  5. loj #6261 一个人的高三楼 FFT + 组合数递推

    \(\color{#0066ff}{ 题目描述 }\) 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静. 不过,\(HSD\) 桑还有一些作业没有完成,他需要在这个晚自习写完.比如这道数学题: ...

  6. UVa1635 - Irrelevant Elements

    通过观察发现其规律符合杨辉三角 需要注意的是最后ai的系数是C(i-1,n-1) 那么,问题就可以变成判断C(0,n-1),C(1,n-1)....C(n-1,n-1)哪些是m的倍数 只需要计算出m的 ...

  7. Codeforces 631 (Div. 2) D. Dreamoon Likes Sequences 位运算^ 组合数 递推

    https://codeforces.com/contest/1330/problem/D 给出d,m, 找到一个a数组,满足以下要求: a数组的长度为n,n≥1; 1≤a1<a2<⋯&l ...

  8. CTU Open 2018 Lighting /// 组合数递推 二进制

    题目大意: 给定n k 给定一个数的二进制位a[] 求这个数加上 另一个二进制位<=n的数b 后 能得到多少个不同的 二进制位有k个1 的数 样例 input10 51000100111 out ...

  9. UVa 10253 (组合数 递推) Series-Parallel Networks

    <训练之南>上的例题难度真心不小,勉强能看懂解析,其思路实在是意想不到. 题目虽然说得千奇百怪,但最终还是要转化成我们熟悉的东西. 经过书上的神分析,最终将所求变为: 共n个叶子,每个非叶 ...

随机推荐

  1. rsync+inotify实时同步环境部署记录

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足.首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件 ...

  2. memcached缓存知识简单梳理

    memcached工作原理基本概念:slab,page,chunk.slab,是一个逻辑概念.它是在启动memcached实例的时候预处理好的,每个slab对应一个chunk size,也就是说不同s ...

  3. 一个简单的scrapy爬虫抓取豆瓣刘亦菲的图片地址

    一.第一步是创建一个scrapy项目 sh-3.2# scrapy startproject liuyifeiImage sh-3.2# chmod -R 777 liuyifeiImage/ 二.分 ...

  4. android Camera 如何判断当前使用的摄像头是前置还是后置

    现在 android 平台的智能手机一般都标配有两颗摄像头.在 Camera 中都存在摄像头切换的功能. 并且有一些功能前后置摄像头上会有所不同.譬如人脸检测,人脸识别,自动对焦,闪光灯等功能, 如果 ...

  5. Sublime 将 Tab 转为空格

    最近在使用 vue-cli 搭建项目,但每次用 Hbuilder 编写 vue 文件的时候,如果存在<script>部分就会报错,错误信息大意是说空格有问题.仔细研究了之后才知道,这是因为 ...

  6. 在opencv3中实现机器学习之:利用正态贝叶斯分类

    opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "op ...

  7. ant命令总结

    ant命令总结 博客分类: 版本管理 svn , maven , ant   ant命令总结 1 Ant是什么?  Apache Ant 是一个基于 Java的生成工具. 生成工具在软件开发中用来将源 ...

  8. findstr()与strfind()的区别

    matlab中这两个字符串查找的函数findstr(), strfind()表明上看起来用法相似,效果也相似. 1. findstr(s1,s2)--在较长的字符串中查找较短的字符串出现的次数,并返回 ...

  9. SVPullToRefresh​ 下拉刷新,上拉加载

    https://github.com/Sephiroth87/ODRefreshControl 类似刷新控件,类似qq动画的那种刷新. 一.下载第三方库 https://github.com/samv ...

  10. survival analysis 生存分析与R 语言示例 入门篇

    原创博客,未经允许,不得转载. 生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等. ...