经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
cf1043F. Make It One(dp 容斥原理)
来源:cnblogs  作者:自为风月马前卒  时间:2018/10/30 9:00:24  对本文有异议

题意

题目链接

给出\(n\)个数,问最少选几个数,使他们的\(gcd = 1\)

Sol

好神仙啊qwq。

首先,如果答案存在,那么最多为\(7\)(因为前\(7\)个质数乘起来\(>= 3e5\))

考虑dp,设\(f[i][j]\)表示选了\(i\)个数,他们\(gcd = j\)的方案数!

没错是方案数!

那么我们只要最后考虑一下\(f[i][1]\)是否有解就行了

\(cnt[i]\)表示有多少个\(a_i\)存在\(i\)这个约数

转移的时候\(f[i][j] = C_{cnt[i]}^i - f[i][j * k], k >= 2\)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #include<vector>
  7. #include<set>
  8. #include<queue>
  9. #include<cmath>
  10. #include<tr1/unordered_map>
  11. //#include<ext/pb_ds/assoc_container.hpp>
  12. //#include<ext/pb_ds/hash_policy.hpp>
  13. #define Pair pair<int, int>
  14. #define MP(x, y) make_pair(x, y)
  15. #define fi first
  16. #define se second
  17. //#define int long long
  18. #define LL long long
  19. #define ull unsigned long long
  20. #define rg register
  21. #define pt(x) printf("%d ", x);
  22. //#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
  23. //char buf[(1 << 22)], *p1 = buf, *p2 = buf;
  24. //char obuf[1<<24], *O = obuf;
  25. //void print(int x) {if(x > 9) print(x / 10); *O++ = x % 10 + '0';}
  26. //#define OS *O++ = ' ';
  27. using namespace std;
  28. //using namespace __gnu_pbds;
  29. const int MAXN = 3e5 + 11, INF = 1e9 + 10, mod = 998244353, Mx = 3e5;
  30. const double eps = 1e-9;
  31. inline int read() {
  32. char c = getchar();
  33. int x = 0, f = 1;
  34. while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
  35. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  36. return x * f;
  37. }
  38. int N, a[MAXN], f[12][MAXN], cnt[MAXN], fac[MAXN], ifac[MAXN];
  39. int add(int x, int y) {
  40. if(x + y < 0) return x + y + mod;
  41. return x + y >= mod ? x + y - mod : x + y;
  42. }
  43. int mul(int x, int y) {
  44. return 1ll * x * y % mod;
  45. }
  46. int C(int N, int M) {
  47. if(N < M) return 0;
  48. return mul(fac[N], mul(ifac[M], ifac[N - M]));
  49. }
  50. int fp(int a, int p) {
  51. int base = 1;
  52. while(p) {
  53. if(p & 1) base = mul(base, a);
  54. a = mul(a, a); p >>= 1;
  55. }
  56. return base;
  57. }
  58. main() {
  59. N = read();
  60. for(int i = 1; i <= N; i++) {
  61. a[i] = read(), cnt[a[i]]++, f[1][a[i]]++;
  62. if(a[i] == 1) {puts("1"); return 0;}
  63. }
  64. fac[0] = 1; for(int i = 1; i <= N; i++) fac[i] = mul(i, fac[i - 1]);
  65. ifac[N] = fp(fac[N], mod - 2);
  66. for(int i = N; i >= 1; i--) ifac[i - 1] = mul(i, ifac[i]);
  67. for(int i = 1; i <= Mx; i++)
  68. for(int j = i + i; j <= Mx; j += i) cnt[i] += cnt[j];
  69. for(int i = 2; i <= 11; i++) {
  70. for(int j = Mx; j >= 1; j--) {
  71. f[i][j] = C(cnt[j], i);
  72. for(int k = j + j; k <= Mx; k += j) f[i][j] = add(f[i][j], -f[i][k]);
  73. }
  74. if(f[i][1] > 0) {printf("%d", i); return 0;}
  75. }
  76. puts("-1");
  77. return 0;
  78. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号