vjudge链接

原题链接

乍一看似乎没什么思路,但是写几个简单的例子之后规律就变得很明显。

比如当 n=5 时,每一步计算后的结果如下:

a1

a1+a2

a1+2a2+a3

a1+3a2+3a3+a4

a1+4a2+6a3+4a4+a5

显然系数“1, 4, 6, 4, 1”就是杨辉三角第五行。

故某一项的系数是否是题中 m 的倍数,就决定了最终得到的数除以 n 的余数和那一项是否有关。

二项式定理:



从中很容易得到前后两项的关系 C(n, k)=(n-k+1)/k*C(n, k-1) 。但是单纯用这个公式暴力得到每个系数一定会导致溢出,故需要运用唯一分解定理分别存储每个系数的素因数和指数。

一般的代码不难给出,但是一直TLE。最后发觉应该先分解 m ,再得到 m 的素因数在各个 C(n,k) 中的指数,若指数过小则可以提前结束当前的分解。由于 m>1 ,可以忽略 nk 和 n0 的情况。

我的 AC 代码如下,最初是用 ANSI C 写的,一步一步改过来,故非常不简洁。其中用 map 存储素因数,其中元素 -1 用来作为该项是否能被 m 整除的 flag。

  1. /*
  2. *lang C++ 5.3.0
  3. *user Weilin_C
  4. */
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <cctype>
  8. #include <cstdio>
  9. #include <cmath>
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <algorithm>
  13. #include <sstream>
  14. #include <vector>
  15. #include <map>
  16. //#include <unordered_map>
  17. #include <set>
  18. #include <list>
  19. #include <queue>
  20. //每个数用map分质因数存储
  21. //质数用素数筛 2-1000000000, MAXM=1000000
  22. #define MAXM 1000000
  23. #define MAXN 100000+5
  24. using namespace std;
  25. map <int, int> sta[MAXN], mm;
  26. int pos[MAXN];
  27. int prime[MAXM+1];
  28. void mtomap (map<int, int> *ma, int n, int p)
  29. { //解码m n: 解码的数 p: 数n的个数
  30. int num=n;
  31. for (int i=2; i<=MAXM && num>0; i++) {
  32. if (!prime[i]) {
  33. while (num%i==0 && num>0) {
  34. num/=i;
  35. (*ma).insert(pair<int, int>(i, 0));
  36. (*ma)[i]+=p;
  37. }
  38. }
  39. }
  40. if (num>1) (*ma).insert(pair<int, int>(num, 1));
  41. return;
  42. }
  43. void ntomap (map<int, int> *ma, int n, int p)
  44. { //用于逐个解码第n行的杨辉三角 n: 解码的数 p: 数n的个数
  45. map <int, int>::iterator it;
  46. int num=n, t;
  47. if (n<2) return;
  48. for (it=mm.begin(); it!=mm.end(); it++) {
  49. t=it->first;
  50. if (t<2) continue;
  51. (*ma).insert(pair<int, int>(t, 0));
  52. while (num%t==0 && num>0) {
  53. num/=t;
  54. (*ma)[t]+=p;
  55. }
  56. if ((*ma)[t]<it->second) (*ma)[-1]=0;
  57. }
  58. return;
  59. }
  60. int judge(map<int, int> *ma)
  61. { //是否为0或1
  62. int flag=0;
  63. map <int, int>::iterator it;
  64. for (it=(*ma).begin(); it!=(*ma).end(); it++)
  65. if (it->second!=0 && it->first!=-1) {
  66. flag=1;
  67. break;
  68. }
  69. return flag;
  70. }
  71. int main()
  72. {
  73. int m, n;
  74. //freopen("input.txt", "r", stdin);
  75. //freopen("output.txt", "w", stdout);
  76. /* C(n, k) = (n-k+1)/k * C(n, k-1) */
  77. for (int i=2; i<=sqrt(MAXM+1); i++) {
  78. if (prime[i]) continue;
  79. for (int j=i+i; j<=MAXM; j+=i) prime[j]=1;
  80. }
  81. while (scanf("%d%d", &n, &m)==2) { //n: 杨辉三角层数
  82. //printf("%d %d\n", n, m);
  83. for (int i=0; i<=n; i++) if (!sta[i].empty()) sta[i].clear();
  84. mm.clear();
  85. sta[0][m]=0;
  86. sta[0][-1]=0;
  87. mtomap(&mm, m, 1);
  88. map <int, int>::iterator it;
  89. for (int i=1; i<n; i++) {
  90. for (it=sta[i-1].begin(); it!=sta[i-1].end(); it++) sta[i][it->first]=it->second;
  91. sta[i][-1]=1;
  92. ntomap(&sta[i], n-i, 1);
  93. ntomap(&sta[i], i, -1);
  94. }
  95. pos[0]=0;
  96. int ans=0;
  97. for (int i=0; i<n; i++) {
  98. if (sta[i][-1] && judge(&sta[i])) {
  99. ans++;
  100. pos[++pos[0]]=i+1;
  101. }
  102. }
  103. printf("%d\n", ans);
  104. int f=0;
  105. for (int i=1; i<=pos[0]; i++) {
  106. if (f) putchar(' ');
  107. else f=1;
  108. printf("%d", pos[i]);
  109. }
  110. putchar('\n');
  111. }
  112. return 0;
  113. }

by SDUST weilinfox

本文链接:https://www.cnblogs.com/weilinfox/p/12241600.html

Irrelevant Elements UVA-1635 (二项式定理)的更多相关文章

  1. Irrelevant Elements UVA - 1635 二项式定理+组合数公式+素数筛+唯一分解定理

    /** 题目:Irrelevant Elements UVA - 1635 链接:https://vjudge.net/problem/UVA-1635 题意:給定n,m;題意抽象成(a+b)^(n- ...

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

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

  3. UVa 1635 - Irrelevant Elements-[分解质因数]

    Young cryptoanalyst Georgie is investigating different schemes of generating random integer numbers ...

  4. POJ2167 Irrelevant Elements

    Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Description Young cryp ...

  5. POJ 2167 Irrelevant Elements 质因数分解

    Irrelevant Elements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2231   Accepted: 55 ...

  6. UVa 1635 - Irrelevant Elements(二项式系数 + 唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UVa 1635 (唯一分解定理) Irrelevant Elements

    经过紫书的分析,已经将问题转化为求组合数C(n-1, 0)~C(n-1, n-1)中能够被m整除的个数,并输出编号(这n个数的编号从1开始) 首先将m分解质因数,然后记录下每个质因子对应的指数. 由组 ...

  8. UVA 1635 Irrelevant Elements

    https://vjudge.net/problem/UVA-1635 题意:n个数,每相邻两个求和,最后变成1个数,问这个数除m的余数与第几个数无关 n个数使用次数分别为C(n-1,i) i∈[0, ...

  9. UVa 1635 无关的元素(唯一分解定理+二项式定理)

    https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...

随机推荐

  1. cisco网络设备IOS升级步骤

    step1:检查和备份================================================================4507R#write4507R#copy run ...

  2. sqlserver 2005 备份还原失败

    1.直接右键还原数据库可能会失败.如果失败 使用下面的sql语句还原 USE MASTER RESTORE DATABASE bingo FROM DISK = 'F:\DevProject\bing ...

  3. DEVOPS技术实践_08:声明式管道语法

    简介 前面简单的做了管道的实验,看了一下的它的效果 声明式管道是Groovy语法中的一个更简单和结构化的语法.下面主要学习明式管道语法. 一 声明式管道的基本结构 以上节的代码为例 node { de ...

  4. 【题解】BZOJ4241: 历史研究(魔改莫队)

    [题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...

  5. $tarjan$简要学习笔记

    $QwQ$因为$gql$的$tarjan$一直很差所以一直想着要写个学习笔记,,,咕了$inf$天之后终于还是写了嘻嘻. 首先说下几个重要数组的基本定义. $dfn$太简单了不说$QwQ$ 但是因为有 ...

  6. 初次在cmd使用git命令上传项目至github方法(笔记)

    在一切开始之前,先推荐一个git简易工具书--Git_Cheat_Sheet,非常适合新手.自行搜索即可,也有热心者提供了中文版. 一.下载 Git 从Git官网下载Git安装包 https://gi ...

  7. Redis 中的数据持久化策略(RDB)

    Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了. Redis 作为一个 ...

  8. .NET Core 3.1之深入源码理解HealthCheck(二)

    写在前面 前文讨论了HealthCheck的理论部分,本文将讨论有关HealthCheck的应用内容. 可以监视内存.磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态. 运行状况检查可以测试应 ...

  9. VS Code配置C/C++环境

    VS Code配置C/C++环境 一.下载和安装VS Code 1.访问VS Code官网下载安装包 2.安装VS Code 3. 安装后, 打开VS Code是英文,按住Ctrl+shift+x进入 ...

  10. javaScript类型和对象

    javaScript基本数据类型 Undefined: Null: Boolean: String: Number: Symbol: Object. 注意 JavaScript 的代码 undefin ...