想好久啊+不敢写啊……但果然人还是应当勇敢自信,只有坚定地去尝试,才会知道最后的结果。1A真的太开心啦,不过好像我的做法还是比较复杂的样子……理解起来应该算是比较容易好懂的类型,大家可以参考一下思路~

  首先我们先考虑一下简单的30分算法:30以内的质数只有十个左右,可以利用状压表示出两个人所选择的集合,再通过寿司转移即可。之后的大数据呢?我们发现不能这样做是因为之后的质数越来越多,状压的空间就开不下了。

  这时要注意到一个性质:对于1~n内的每一个数而言,都可以分解成若干个<sqrt(n)的质数之积 || 在此基础之上再乘上一个 > sqrt(n)的质数。这说明什么?对于所有的>sqrt(n)的质数而言,我们选择一个寿司只可能选择其中的一个——换句话说,就是不同的大质数之间的决策是相互独立的。

  于是就有了如下算法:既然不同的大质数之间不会互相影响,我们就一个一个大质数来统计,之后再累加到一起即可。于是我们增加一维的状态,单独表示这一个大质数。0表示两个集合中均不含有这个大质数因子,1表示第一个人所选择的集合中含这个因子,2表示第二个人选择的集合中含有这个因子。不同的因子之间的转移将所有1&2的状态都加入0并清空1&2即可(对于新的质数来说,之前没有作出过相应的决策,所以是不含有该因子的)。

  网上代码很短,然而我莫名长……

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 1000
  4. #define maxt 260
  5. #define int long long
  6. int n, mod, S[maxn], CNST = ( << ) - ;
  7. int cnt, dp[][maxt][maxt], num[maxn], mark[maxn];
  8. int tot, P[maxn], cnp = , ans;
  9. int pri[maxn] = {, , , , , , , , };
  10. map <int, int> Map;
  11.  
  12. int read()
  13. {
  14. int x = ;
  15. char c;
  16. c = getchar();
  17. while(c < '' || c > '') c = getchar();
  18. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  19. return x;
  20. }
  21.  
  22. int up(int &x, int y)
  23. {
  24. x += y;
  25. if(x >= mod) x -= mod;
  26. }
  27.  
  28. void work(int i)
  29. {
  30. for(int x = CNST; ~x; x --)
  31. for(int y = CNST; ~y; y --)
  32. {
  33. if(x & y) continue;
  34. int a = dp[][x][y], b = dp[][x][y];
  35. up(dp[][x | num[i]][y], dp[][x][y]);
  36. up(dp[][x][y | num[i]], dp[][x][y]);
  37.  
  38. up(dp[][x | num[i]][y], a);
  39. up(dp[][x][y | num[i]], b);
  40. }
  41. }
  42.  
  43. void DP(int k)
  44. {
  45. for(int x = ; x <= CNST; x ++)
  46. for(int y = ; y <= CNST; y ++)
  47. if(x & y) continue;
  48. else
  49. {
  50. up(dp[][x][y], dp[][x][y]);
  51. up(dp[][x][y], dp[][x][y]);
  52. dp[][x][y] = dp[][x][y] = ;
  53. }
  54. if(k) for(int i = k; i <= n + ; i += k) work(i);
  55. else
  56. {
  57. for(int i = ; i <= cnt; i ++)
  58. for(int x = CNST; ~x; x --)
  59. for(int y = CNST; ~y; y --)
  60. {
  61. if(x & y) continue;
  62. int k = S[i];
  63. int a = dp[][x][y];
  64. up(dp[][x | num[k]][y], a);
  65. up(dp[][x][y | num[k]], a);
  66. }
  67. }
  68. }
  69.  
  70. signed main()
  71. {
  72. n = read() - , mod = read();
  73. dp[][][] = ;
  74. for(int i = ; i <= n + ; i ++)
  75. {
  76. int k = i;
  77. for(int j = ; j <= cnp; j ++)
  78. {
  79. if(!(k % pri[j])) num[i] |= ( << (j - ));
  80. while(!(k % pri[j])) k /= pri[j];
  81. }
  82. if(k != && k != )
  83. {
  84. mark[i - ] = k;
  85. if(!Map[k]) Map[k] = , P[++ tot] = k;
  86. }
  87. else S[++ cnt] = i;
  88. }
  89. for(int i = ; i <= tot; i ++)
  90. DP(P[i]);
  91. for(int i = ; i <= CNST; i ++)
  92. for(int j = ; j <= CNST; j ++)
  93. if(i & j) continue;
  94. else
  95. {
  96. up(ans, dp[][i][j]);
  97. up(ans, dp[][i][j]);
  98. up(ans, dp[][i][j]);
  99. }
  100. printf("%lld\n", ans);
  101. return ;
  102. }

【题解】NOI2015寿司晚宴的更多相关文章

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

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

  2. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

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

  3. BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...

  4. [BZOJ4197][Noi2015]寿司晚宴

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

  5. BZOJ 4197: [Noi2015]寿司晚宴( dp )

    N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...

  6. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

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

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

  8. BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...

  9. bzoj 4199 [NOI2015]寿司晚宴

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

  10. 【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp

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

随机推荐

  1. git中如何忽略文件上传?

    使用原因:至于我们为什么要使用git忽略文件,原因很多.就比如我自己的情况吧!自己一个人多地方开发,为了代码同步,这样很方便.但是有个问题就是,我创建 的是开源项目,上面有一些服务器上面的配置信息,这 ...

  2. 批处理,%~d0 cd %~dp0 代表什么意思

    批处理,%~d0 cd %~dp0 代表什么意思   ~dp0 “d”为Drive的缩写,即为驱动器,磁盘.“p”为Path缩写,即为路径,目录cd是转到这个目录,不过我觉得cd /d %~dp0 还 ...

  3. node解析post表单信息

    一共有4种解析方式 urlencoded.json.text .raw 发起请求的form表单中可以设置三种数据编码方式 application/x-www-form-urlencoded.multi ...

  4. (数据科学学习手札27)sklearn数据集分割方法汇总

    一.简介 在现实的机器学习任务中,我们往往是利用搜集到的尽可能多的样本集来输入算法进行训练,以尽可能高的精度为目标,但这里便出现一个问题,一是很多情况下我们不能说搜集到的样本集就能代表真实的全体,其分 ...

  5. C# 集合之Dictionary详解

    开讲. 我们知道Dictionary的最大特点就是可以通过任意类型的key寻找值.而且是通过索引,速度极快. 该特点主要意义:数组能通过索引快速寻址,其他的集合基本都是以此为基础进行扩展而已. 但其索 ...

  6. js字符串操作函数

    js字符串函数 JS自带函数 concat 将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world&quo ...

  7. cadence17.2的OrCAD启动找不到license的问题

    1. cadence17.2的OrCAD每次启动都说找不到license 2. 提示是找不到licence,看下系统变量,licence的路径是在的 3. 估计是读取licence的路径的服务未开启, ...

  8. springmvc基础篇—修改默认的配置文件名称及位置

    springmvc的默认配置文件是放在WEB-INF下的,叫action-servlet.xml.根据咱们编程的习惯,一般都将配置文件放到src的根目录下,那么如何将这个文件迁移过来呢?其实很简单,请 ...

  9. result returns more than one elements此种错误,解决

    场景:公司产品开发完成后,接入第三方厂商,在进行接口联调的时候出现此问题.此接口报文中的每一个数据都要进行校验,有些是与已经存入产品数据库中的数据进行对比,看是否存在. 问题:在测试中,有些测试没有问 ...

  10. 维特比算法(Viterbi)及python实现样例

    维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...