经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
cf900D. Unusual Sequences(容斥 莫比乌斯反演)
来源:cnblogs  作者:自为风月马前卒  时间:2019/1/28 9:45:23  对本文有异议

题意

题目链接

Sol

首先若y % x不为0则答案为0

否则,问题可以转化为,有多少个数列满足和为y/x,且整个序列的gcd=1

考虑容斥,设\(g[i]\)表示满足和为\(i\)的序列的方案数,显然\(g[i] = 2^{i-1}\)(插板后每空位放不放)

同时还可以枚举一下gcd,设\(f[i]\)表示满足和为\(i\)且所有数的gcd为1的方案,\(g[i] = \sum_{d | i} f[\frac{n}{d}]\)

反演一下,\(f[i] = \sum_{d | i} \mu(d) g(\frac{i}{d})\)

mu函数可以暴力枚举质因子得到

复杂度\(O(2^{Mx} * Mx + \sqrt{N}\)\(Mx\)最大为10

  1. #include<bits/stdc++.h>
  2. #define Pair pair<int, int>
  3. #define MP(x, y) make_pair(x, y)
  4. #define fi first
  5. #define se second
  6. #define int long long
  7. #define LL long long
  8. #define Fin(x) {freopen(#x".in","r",stdin);}
  9. #define Fout(x) {freopen(#x".out","w",stdout);}
  10. //#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
  11. //char buf[(1 << 22)], *p1 = buf, *p2 = buf;
  12. using namespace std;
  13. const int MAXN = 1e6 + 10, mod = 1e9 + 7, INF = 1e9 + 10;
  14. const double eps = 1e-9;
  15. template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
  16. template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
  17. template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
  18. template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
  19. template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
  20. template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
  21. template <typename A> inline void debug(A a){cout << a << '\n';}
  22. template <typename A> inline LL sqr(A x){return 1ll * x * x;}
  23. inline int read() {
  24. char c = getchar(); int x = 0, f = 1;
  25. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  26. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  27. return x * f;
  28. }
  29. int x = read(), y = read();
  30. map<int, int> mu;
  31. int g(int a, int p) {
  32. int base = 1;
  33. while(p) {
  34. if(p & 1) base = mul(base, a);
  35. p >>= 1; a = mul(a, a);
  36. }
  37. return base;
  38. }
  39. signed main() {
  40. if(y % x != 0) return puts("0"), 0;
  41. vector<int> d; y /= x; int p = y;
  42. for(int i = 2; i * i <= y; i++)
  43. if(!(y % i)) {
  44. d.push_back(i);
  45. while(!(y % i)) y /= i;
  46. }
  47. if(y != 1) d.push_back(y);
  48. y = p;
  49. for(int sta = 0; sta < (1 << d.size()); sta++) {
  50. int v = 1, t = 1;
  51. for(int i = 0; i < d.size(); i++) if(sta & (1 << i)) t *= -1, v *= d[i];
  52. mu[v] = t;
  53. }
  54. int ans = 0;
  55. for(auto &x: mu) {
  56. int d = x.fi, m = x.se;
  57. add2(ans, mul(m + mod, g(2, y / d - 1)));
  58. }
  59. cout << ans;
  60. return 0;
  61. }

原文链接:http://www.cnblogs.com/zwfymqz/p/10327298.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站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号