uva 4683

这题的意思是给一个集合,最多有12个元素。

找出仅仅能被集合中一个仅且一个数整除的第n个数。

(n <= 10^15)。

我用容斥原理做的。先把能被每一个数整除的元素个数累加,当然会有反复的。若某个数由集合中两个数组成,那么要减去全部这个数的整数倍,并且要减两次,由于他是两个数的公约数,而当某个数是当中三个数的公约数,那他一定也是两个数的公约数,这样就多减了c[k][2]个,就得加上。以此类推。

要求第n个数,题目说答案最大是10^15,我以10^15为界限进行二分。对于[1,m]内若符合条件的数是res个。若res >= n,那么high = mid-1,否则low = mid+1。

可是我的代码没过,无限TLE。。代码先贴这里。希望路过的大神给予指点。

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <bitset>
  6. #include <list>
  7. #include <stack>
  8. #include <vector>
  9. #include <math.h>
  10. #include <string.h>
  11. #include <queue>
  12. #include <string>
  13. #include <stdlib.h>
  14. #include <algorithm>
  15. //#define long long __int64
  16. //#define LL long long
  17. #define eps 1e-9
  18. #define PI acos(-1.0)
  19. //typedef __int64 LL;
  20.  
  21. using namespace std;
  22. const long long Max = 1000000000000000;
  23. int k;
  24. long long n;
  25. int a[15];
  26. long long C[15][15];
  27.  
  28. long long gcd(long long a, long long b)
  29. {
  30. if(b == 0) return a;
  31. return gcd(b,a%b);
  32. }
  33. long long lcm(long long a, long long b)
  34. {
  35. return a/gcd(a,b)*b;
  36. }
  37.  
  38. void init()
  39. {
  40. memset(C,0,sizeof(C));
  41. for(int i = 1; i <= 12; i++)
  42. {
  43. for(int j = 0; j <= i; j++)
  44. {
  45. if(j == 0 || j == i)
  46. C[i][j] = 1;
  47. else if(j == 1)
  48. C[i][j] = i;
  49. else
  50. C[i][j] = C[i-1][j-1] + C[i-1][j];
  51. }
  52. }
  53. }
  54.  
  55. long long cal(long long m)
  56. {
  57. long long ans = 0;
  58.  
  59. for(int i = 1; i < (1<<k); i++)
  60. {
  61. int cnt = 0;
  62. long long mul = 1;
  63. for(int j = 0; j < k; j++)
  64. {
  65. if(i&(1<<j))
  66. {
  67. cnt++;
  68. mul = lcm(mul,a[j]);
  69. }
  70. }
  71. if(cnt&1)
  72. ans += C[k][cnt-1]*(m/mul);
  73. else
  74. ans -= cnt*(m/mul);
  75. }
  76. return ans;
  77. }
  78.  
  79. int main()
  80. {
  81. int test;
  82. init();
  83. scanf("%d",&test);
  84. while(test--)
  85. {
  86. scanf("%d %I64d",&k,&n);
  87. for(int i = 0; i < k; i++)
  88. {
  89. scanf("%d",&a[i]);
  90. }
  91. long long low = 0,high = Max;
  92. while(low <= high)
  93. {
  94. long long mid = (low + high)/2;
  95. long long res = cal(mid);
  96. if(res >= n)
  97. high = mid-1;
  98. else
  99. low = mid+1;
  100. }
  101. printf("%I64d\n",low);
  102. }
  103. return 0;
  104. }

UVA 4683 - Find The Number的更多相关文章

  1. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  2. UVA - 10689 Yet another Number Sequence 矩阵快速幂

                      Yet another Number Sequence Let’s define another number sequence, given by the foll ...

  3. uva 10077 - The Stern-Brocot Number System

    想法: 初始化三個數L=0/1, M=1/1, R=1/0,設輸入的分數為a: 如果a<M,那麼要往左邊走,    R = M;    M = (L分子+M分子)/(L分母+M分母); 如果a& ...

  4. UVA 10689 Yet another Number Sequence

    简单矩阵快速幂. if(m==1) MOD=10; if(m==2) MOD=100; if(m==3) MOD=1000; if(m==4) MOD=10000; 剩下的就是矩阵快速幂求斐波那契数列 ...

  5. 【UVa】11882 Biggest Number(dfs+剪枝)

    题目 题目     分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之 ...

  6. UVA - 10689 Yet another Number Sequence (矩阵快速幂求斐波那契)

    题意:已知f(0) = a,f(1) = b,f(n) = f(n − 1) + f(n − 2), n > 1,求f(n)的后m位数. 分析:n最大为109,矩阵快速幂求解,复杂度log2(1 ...

  7. UVA 10689 Yet another Number Sequence 矩阵快速幂 水呀水

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  8. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  9. 「kuangbin带你飞」专题十九 矩阵

    layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...

随机推荐

  1. Hdu-6253 2017CCPC-Final K.Knightmare 规律

    题面 题意:给你一个无限大的棋盘,一个象棋中的马,问你这个马,飞n步后,可能的位置有多少种? 题解:看到题,就想先打表试试,于是先写个暴力(枚举每个位置,是马就飞周围8个格子,注意不要在同个循环里把格 ...

  2. POJ-3061 Subsequence 二分或尺取

    题面 题意:给你一个长度为n(n<100000)的数组,让你找到一个最短的连续子序列,使得子序列的和>=m  (m<1e9) 题解: 1 显然我们我们可以二分答案,然后利用前缀和判断 ...

  3. LeetCode.2-两个数字相加(Add Two Numbers)

    这是悦乐书的第340次更新,第364篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第1题(顺位题号是2).给定两个非空链表,表示两个非负整数. 数字以相反的顺序存储, ...

  4. php对文件/目录操作的基础知识(图解)

    具体的如下图所示:

  5. Install opencv on Centos

    研究centos 有很长一段时间了,一直没有写过这方面的感觉,今天在看到网友的一篇文章时,结合亲身体会就下面安装opencv的一些步骤与大家共享. CentOS OpenCV已被广泛应用但是也在不断的 ...

  6. 使用Axis2方式发布webService实例说明

    1.简单的pojo方式: 不需要写配置文件,直接把class文件拷贝到axis2的WEB-INF目录下的poji文件夹下即可.但其局限性表现在,实现类不能有包声明,这在实际开发过程中使用较少,这里不做 ...

  7. Python中OpenCV2. VS. CV1

    OpenCV的2.4.7.版本生成了python的CV2模块,可以直接载入: 有兴趣的可以参考这个教程:http://blog.csdn.net/sunny2038/article/details/9 ...

  8. CImage类的使用介绍!

    链接参考:http://www.cnblogs.com/juncheng/articles/1600730.html CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF. ...

  9. CorelDRAW X8官方正版特惠下载

    CorelDRAW X8自发布以来,价格居高不下,这也使一众忠粉望而却步,之前看过CorelDRAW做活动,都是X6\X7这些比较早的版本,比较新的版本也没做什么优惠,不过还好看了一下,CorelDR ...

  10. 洛谷P3807 【模板】卢卡斯定理_组合数学模板

    Code: #include<cstdio> using namespace std; typedef long long LL; const int maxn=1000000+2; LL ...