这个题一开始想到了唯一分解定理,然后状压。但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了。

然后正常状压dp就很好搞了。

题干:

  1. Description
  2.  
  3. 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。
  4. 在晚宴上,主办方为大家提供了 n 种不同的寿司,编号 ,,,…,n−,其中第 i 种寿司的美味度为 i+ (即寿司的美味度为从 n)。
  5. 现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 x 的寿司,小 W 品尝的寿司中存在一种美味度为 y 的寿司,而 x y 不互质。
  6. 现在小 G 和小 W 希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数 p 取模)。注意一个人可以不吃任何寿司。
  7. Input
  8. 输入文件的第 行包含 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。
  9. Output
  10. 输出一行包含 个整数,表示所求的方案模 p 的结果。
  11. Sample Input
  12.  
  13. Sample Output
  14.  
  15. HINT
  16. n
  17. <p

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. #define duke(i,a,n) for(int i = a;i <= n;i++)
  7. #define lv(i,a,n) for(int i = a;i >= n;i--)
  8. #define clean(a) memset(a,0,sizeof(a))
  9. const int INF = << ;
  10. const int mod = ;
  11. typedef double db;
  12. typedef long long ll;
  13. template <class T>
  14. void read(T &x)
  15. {
  16. char c;
  17. bool op = ;
  18. while(c = getchar(), c < '' || c > '')
  19. if(c == '-') op = ;
  20. x = c - '';
  21. while(c = getchar(), c >= '' && c <= '')
  22. {x = x * + c - '';}
  23. if(op) x = -x;
  24. }
  25. template <class T>
  26. void write(T x)
  27. {
  28. if(x < ) putchar('-'), x = -x;
  29. if(x >= ) write(x / );
  30. putchar('' + x % );
  31. }
  32. ll pri[] = {,,,,,,,,,};
  33. struct node
  34. {
  35. ll val,big,s;
  36. void init()
  37. {
  38. ll tmp = val;
  39. big = -;
  40. duke(i,,)//only
  41. {
  42. if(tmp % pri[i]) continue;
  43. s |= ( << (i - ));
  44. while(tmp % pri[i] == )
  45. tmp /= pri[i];
  46. }
  47. if(tmp != )
  48. big = tmp;
  49. }
  50. }a[];
  51. bool cmp(node a,node b)
  52. {
  53. return a.big < b.big;
  54. }
  55. ll n;
  56. ll p;
  57. ll pl(ll l,ll r)
  58. {
  59. l += r;
  60. return l >= p ? l - p : l;
  61. }
  62. ll f1[][],f2[][];
  63. ll dp[][];
  64. int main()
  65. {
  66. read(n);read(p);
  67. duke(i,,n)
  68. a[i - ].val = i,a[i - ].init();
  69. sort(a + ,a + n,cmp);
  70. dp[][] = ;
  71. duke(i,,n - )
  72. {
  73. if(i == || a[i].big != a[i - ].big || a[i].big == -)
  74. {
  75. memcpy(f1,dp,sizeof(f1));
  76. memcpy(f2,dp,sizeof(f2));
  77. }
  78. lv(j,,)
  79. {
  80. lv(k,,)
  81. {
  82. if(j & k) continue;
  83. if((a[i].s & j) == )
  84. f2[j][k | a[i].s] = pl(f2[j][k | a[i].s],f2[j][k]);
  85. if((a[i].s & k) == )
  86. f1[j | a[i].s][k] = pl(f1[j | a[i].s][k],f1[j][k]);
  87. }
  88. }
  89. if(i == n - || a[i].big != a[i + ].big || a[i].big == -)
  90. {
  91. duke(j,,)
  92. {
  93. duke(k,,)
  94. {
  95. if(j & k) continue;
  96. dp[j][k] = pl(f1[j][k],pl(f2[j][k],p - dp[j][k]));
  97. }
  98. }
  99. }
  100. }
  101. ll ans = ;
  102. duke(j,,)
  103. {
  104. duke(k,,)
  105. {
  106. if((j & k) == && dp[j][k])
  107. ans = pl(ans,dp[j][k]);
  108. // cout<<dp[j][k]<<" ";
  109. }
  110. // cout<<endl;
  111. }
  112. printf("%lld\n",ans);
  113. return ;
  114. }

B4197 [Noi2015]寿司晚宴 状压dp的更多相关文章

  1. [NOI2015]寿司晚宴 --- 状压DP

    [NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...

  2. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  3. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

  4. BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解

    挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...

  5. [NOI2015]寿司晚宴——状压dp

    题目转化:将2~n的数分成两组,可以不选,使得这两组没有公共的质因子.求方案数. 选择了一个数,相当于选择了它的所有质因子. 30分: 发现,n<=30的时候,涉及到的质因子也就10个.2,3, ...

  6. 【BZOJ-4197】寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  7. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  8. NOI 2015 寿司晚宴 (状压DP+分组背包)

    题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...

  9. [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]

    题面 传送门 思路 首先,要让两个人选的数字全部互质,那么有一个显然的充要条件:甲选的数字的质因数集合和乙选的数字的质因数集合没有交集 30pt 这种情况下n<=30,也就是说可用的质数只有10 ...

随机推荐

  1. iptables详解(1):iptables概念

    所属分类:IPtables  Linux基础  基础知识  常用命令 这篇文章会尽量以通俗易懂的方式描述iptables的相关概念,请耐心的读完它. 防火墙相关概念 此处先描述一些相关概念. 从逻辑上 ...

  2. Queueingconsumer 找不到

    springboot从1.5.9升级到2.0.0,queueingconsumer报错没有这个类,改为使用 DefaultConsumer

  3. jQuey中的return false作用是什么?

    jQuey中的return false作用是什么?在众多的语句中都有return false的使用,当然对于熟悉它的开发者来说,当然是知根知底,知道此语句的作用,当然也就知道在什么时候使用此语句,不过 ...

  4. 字符串系列——KMP模板整理

    KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...

  5. 散列--P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,-,L,都种有 ...

  6. linux(Ubuntu16)下切换python2和python3(转)

    采用update-alternatives 切换版本 1.打开终端:Ctrl+Alt+T 2.查看update-alternatives的帮助信息:update-alternatives --help ...

  7. linux strings-在对象文件或二进制文件中查找可打印的字符串

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. str ...

  8. response对象设置输出缓冲大小

    response对象设置输出缓冲大小 制作人:全心全意 通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区,在计算机术语中,缓冲区被定义为暂时放置输入或输出资料的内存. ...

  9. 洛谷 2922 BZOJ 1590 [USACO08DEC]秘密消息Secret Message

    [题意概述] 给出n个01串组成的字典和m个询问,每次询问某个01串和多少个字典中的串有相同的前缀.(前缀长度是两串中较小的部分) [题解] 直接上Trie树即可.树上每个节点记录两个信息:这个节点有 ...

  10. 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递

    [题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...