对于这种找互质的数的集合的题,一般是讨论每个数的质因子会不会有重复。

听说这种互质的题把质因子分为小于 n\sqrt{n}n​ 和大于 n\sqrt{n}n​ 是经典套路?

因为当 nnn 很小的时候,小于 n\sqrt{n}n​ 的质数并不多。比如对于这一题,小于 N=1000\sqrt{N=1000}N=1000​ 的数只有 111111 个。

那么对于那些只有小于 N\sqrt{N}N​ 的质因子的数进行状压 dp,设 dp(i,j)dp(i,j)dp(i,j) 为前 iii 个数中,所有选出的数的所有质因子的状态为 jjj(只考虑小于 N\sqrt NN​ 的质因子)。

jjj 的定义:如果选出的数的所有质因子中出现了第 kkk 个质数,那么把 jjj 在二进制下的第 kkk 位设为 111,否则为 000。

例如,如果出现了 222(第 111 个质数)、555(第 333 个质数)和 777(第 444 个质数的话),jjj 就应该是 (1101)2(1101)_2(1101)2​。

那么假设 dp(i−1)dp(i-1)dp(i−1) 都已经计算完毕,现在要计算 dp(i,j∣sta[i])dp(i,j|sta[i])dp(i,j∣sta[i]),其中 jjj 是某个状态,sta[i]sta[i]sta[i] 是 iii 的质因子状态。那么现在考虑的是状态 j∣sta[i]j|sta[i]j∣sta[i]。

  1. dp(i,j∣sta[i])=dp(i−1,j∣sta[i])dp(i,j|sta[i])=dp(i-1,j|sta[i])dp(i,j∣sta[i])=dp(i−1,j∣sta[i])。意思就是前 i−1i-1i−1 个数中已经选出了状态 j∣sta[i]j|sta[i]j∣sta[i],那么数 iii 肯定不能在加入这个方案内(不然不互质),所以选的数不增不减。

  2. dp(i,j∣sta[i])=dp(i−1,j+1−(maxpi>11))dp(i,j|sta[i])=dp(i-1,j+1-(maxp_i>11))dp(i,j∣sta[i])=dp(i−1,j+1−(maxpi​>11))。意思就是前 i−1i-1i−1 个数中已经选出了状态 jjj,那么现在肯定可以加入数 iii。但是由于我们这里只考虑加入质因子都小于 N\sqrt{N}N​ 的情况,所以要减去一个 maxpi>11maxp_i>11maxpi​>11。

现在对只有小于 N\sqrt{N}N​ 的质因子的数都处理完了,那么对于含有大于 N\sqrt{N}N​ 的质因子的数怎么处理呢?(不妨设所有大于 N\sqrt{N}N​ 小于 NNN 的质数有 mmm 个)

不难发现,这些数恰好仅含有一个大于 N\sqrt{N}N​ 的质因子。所以我们至少要选 mmm 个数才能保证是“极大方案”。又因为要保证选的数最少,所以要恰好选 mmm 个就行了。

最后可以把 111 也取上。

代码:

#include<bits/stdc++.h>#define N 1010
#define INF 0x7fffffffusing namespace std;int t,n,k;
int cnt,prime[N],maxp[N],sta[N];
int dp[2][1<<12];
bool notprime[N];void init()
{for(int i=2;i<=1000;i++){if(!notprime[i]){prime[++cnt]=i;maxp[i]=cnt;sta[i]=(cnt<=11?(1<<(cnt-1)):0);}for(int j=1;j<=cnt&&i*prime[j]<=1000;j++){int v=i*prime[j];notprime[v]=true;maxp[v]=max(maxp[i],j);sta[v]=sta[i]|(j<=11?(1<<(j-1)):0);}}
}int main()
{init();scanf("%d",&t);for(int T=1;T<=t;T++){scanf("%d%d",&n,&k);int m=1;while(prime[m]<=n) m++;m--;int tmp=max(0,m-11);m=min(m,11);int mpow=(1<<m);for(int i=0;i<mpow;i++) dp[0][i]=INF;dp[0][0]=0;int now=1;for(int i=1;i<=n;i++,now^=1){for(int j=0;j<mpow;j++) dp[now][j]=dp[now^1][j];if(i==k) continue;for(int j=0;j<mpow;j++)if(!(j&sta[i])&&dp[now^1][j]!=INF)dp[now][j|sta[i]]=min(dp[now^1][j|sta[i]],dp[now^1][j]+1-(maxp[i]>11));}printf("Case #%d: %d\n",T,dp[now^1][mpow-1]+tmp+(k!=1));}return 0;
}

【51Nod1386】双马尾机器人(分块+dp)相关推荐

  1. 双马尾机器人(???)

    Portal -->broken qwq Description  给定\(n\)和\(k\),我们要在\(1,2,3,...,n\)中选择若干的数,每一种选择的方案被称为选数方案. 我们定义一 ...

  2. 装上螺旋桨,加州理工让只能行走的双足机器人「上了天」,还玩起了障碍滑板、走绳索...

    视学算法报道 编辑:杜伟.陈萍 能走能飞,这才是最酷的双足机器人吧?! 有的机器人可以行走,有的可以飞行.你见过既能行走又能飞行的双足机器人吗? 加州理工学院的研究人员就打造了这样一台机器人 LEON ...

  3. SDOI2015 约数个数和(莫比乌斯反演经典、双上限整除分块)超详细笔记

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 AcWing 1358. 约数个数和(莫比乌斯反演经典.双上限整除分块) #include <c ...

  4. diy直立双足机器人_速看!近期国内外机器人资讯大汇总

    导语 三季度即将过半,二季度机器人事件回顾,智览行业发展.二季度机器人行业呈现出了怎样的发展动态呢?从行业大角度出发,带领大家回顾过去二季度的行业精彩. 国内 钛米机器人钛元助力首款人工智能5G农业机 ...

  5. 波士顿动力双足机器人Atlas放出逆天体操表演,网友:比我还强

    问耕 发自 凹非寺 量子位 出品 | 公众号 QbitAI 波士顿动力又有新作发布! 这次是双足机器人Atlas,继表演跑酷.后空翻等绝技之后,刚刚Atlas又放出一段逆天的技能展示:全程高能的机器人 ...

  6. ROS(12):双足机器人开发调研

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/49474219 未经博主允许不得转载.  博主地址是:http://blog.cs ...

  7. android 两足机器人,基于Android的双足机器人语音控制系统研究

    摘要: 随着智能终端的快速普及和移动互联网的高速发展,人们通过一部手机连接整个世界的目标似乎已经实现.进入二十一世纪后,人工智能是科技领域绕不开的一个主题.虽然当下对于人工智能的研究或应用还都处于初级 ...

  8. 人工机器:机器人模块化和双足机器人被动行走

    对于机器人,作为服务人或者家庭成员,是否能走进千家万户,还要看机器人的双足是否能够实现. 服务机器人构件: 1.双足机器人的两条腿; 2.被动行走和能源问题; 3.机器组件的模块化; 4.情感作用以及 ...

  9. 基于气动人工肌肉的双足机器人关节设计

    介绍了一种由气动人工肌肉构建的双足机器人关节,该关节利用气动人工肌肉的柔性特性,可以有效控制双足机器人快速行走或跑步时的落地脚冲击问题. 详细给出了气动人工肌肉的工作原理以及由其构成的关节系统的硬件架 ...

最新文章

  1. Jenkins在Mac平台安裝
  2. Caffe源码解析5:Conv_Layer
  3. nyist --- 组队赛(四)
  4. DigSci科学数据挖掘大赛-亚军方案分享
  5. BizTalk动手实验(十六)EDI-AS2解决文案开发配置
  6. python 点滴记录1:python没有Tkinter模块
  7. linux系统输入指令,详解linux系统输入输出管理和vim的常用功能
  8. cocos2d-x3.0 关于CCAnimate 的一些资料
  9. 【JAVA】-- 坦克大战全部代码
  10. David Marr-《视觉计算理论》-思想总结
  11. 【报告分享】城市女性独居调查-COSMODATA100(附下载)
  12. 360无线wifi电脑怎样连接到服务器,360随身Wifi能连接上但是电脑无法上网怎么办...
  13. 计算机网络学习笔记(九)——网络层IP地址
  14. 天使轮、A轮、B轮、C轮、D轮融资 究竟是什么?
  15. iOS 播放系统自带铃声
  16. 二重积分的计算 —— 交换积分顺序(exchange the order of integration)
  17. 左声道,右声道和立体声
  18. linux不识别ntfs分区,解决linux 不能识别ntfs分区问题(linux系统挂载移动硬盘)
  19. 多模态(RGB-D)——深度融合网络
  20. E1: 在idea中执行flink程序时报错 No ExecutorFactory found to execute the application.

热门文章

  1. 2011年IT热点事件回顾 乔布斯逝世上榜
  2. 【GTK4】又快年底了,100行代码教你做一款简单的年会抽奖软件
  3. n1进入recovery模式_如何进入OPPO N1的Recovery模式(安卓系统适用)
  4. centos7代理使用docker国内镜像
  5. php consult用法,YanPHP: YanPHP——一个为API开发而设计的高性能轻量级框架
  6. doraemon的python(大更新) django静态文件的配置(出错多的地方)
  7. java新闻管理系统代码下载_通用新闻管理系统
  8. 锐捷NBR路由器 EWEB网管系统 远程命令执行漏洞 + GetShell
  9. 支付宝扫福字原理及快速获得“福卡”方法
  10. 安卓 7.0 无法获取外置SD卡问题解决方案 | Failed to find configured root that contains