HDU - 6125: Free from square (状压DP+分组背包)
problem:给定N,K。表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数。N,K<500;
solution:显然可以状压DP做,但是500以内的素数还是蛮多的,无法高效得DP。 但是我们注意到,大于sqer(N)的素数,同一类最多用一个,这不就是分组背包吗。
所以我们只有小于sqrt(N)的素数用常规的DP,否则用分组背包。 dp[i][j]表示选择了i个数,其中小于sqrt(N)的素数状态为j。 j<(1<<8);
分组背包:我们把个数放在第一维,就保证了同一类的物品不相互影响,做到了分组。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int Mod=1e9+;
const int maxn=;
int dp[maxn][],a[maxn],x[maxn];
int p[]={,,,,,,,};
vector<int>G[maxn];
void init(int N)
{
rep(i,,N) G[i].clear();
rep(i,,N){
int t=i,tmp=;
rep(j,,){
if(t%(p[j]*p[j])==) {
t=-;
break;
}
if(t%p[j]==) {
t/=p[j];
tmp|=(<<j);
}
}
if(t!=-) {
G[t].push_back(i);
x[i]=tmp;
}
}
}
int main()
{
int N,T,K,ans;
scanf("%d",&T);
while(T--){
memset(dp,,sizeof(dp));
dp[][]=; ans=;
scanf("%d%d",&N,&K);
init(N);
rep(j,,G[].size()-) //1单独考虑
for(int v=K-;v>=;v--){
int t=G[][j];
rep(k,,){
if((x[t]&k)==){
(dp[v+][k|x[t]]+=dp[v][k])%=Mod;
}
}
}
rep(i,,N){
if(G[i].size()==) continue;
for(int v=K-;v>=;v--) //放在第一维保证了分组
rep(j,,G[i].size()-){
int t=G[i][j];
rep(k,,){
if((x[t]&k)==){
(dp[v+][k|x[t]]+=dp[v][k])%=Mod;
}
}
}
}
rep(j,,K)
rep(i,,) (ans+=dp[j][i])%=Mod;
printf("%d\n",ans);
}
return ;
}
HDU - 6125: Free from square (状压DP+分组背包)的更多相关文章
- HDU 6125 Free from square (状压DP+分组背包)
题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于 ...
- HDU 6125 Free from square (状压DP+背包)
题意:问你从 1 - n 至多选 m 个数使得他们的乘积不能整除完全平方数. 析:首先不能整除完全平方数,那么选的数肯定不能是完全平方数,然后选择的数也不能相同的质因子. 对于1-500有的质因子至多 ...
- HDU 6125 Free from square 状态压缩DP + 分组背包
Free from square Problem Description There is a set including all positive integers that are not mor ...
- NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...
- NOIP模拟 乘积 - 状压dp + 分组背包
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...
- HDU 6125 Free from square(状态压缩+分组背包)
http://acm.hdu.edu.cn/showproblem.php?pid=6125 题意: 在${1,2,3,...n}$的数中选择1~k个数,使得它们的乘积不能被平方数整除(1除外),计算 ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- HDU 6149 Valley Numer II 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
随机推荐
- 记RDS数据库表数据误删恢复
1.登录阿里云RDS后台,找到“备份”入口,如下图: 2.下载最近的备份数据,如下图: 3.解压,找到误删数据的表,如下图:(这里拿sys_role举例) 4.在本机(Windows系统), a. 装 ...
- 查看Linux是CentOS还是Ubuntu
lsb_release -a
- linux中vi编辑器没有颜色
vi是没有颜色的,vim是有颜色的.可是系统中没有安装vim. 我们可以通过 rpm -qa |grep vim 看看系统中是否安装了下面3个rpm包,如果有就是安装了vim. 点击(此处)折叠或打开 ...
- 03 Mybatis框架---学习笔记1--框架的概念及优势
1.框架的概念 框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统.简单说就是使用别人搭好的舞台,你来做表演.而且,框架一般是成熟的,不断升级的软件.框架是我们软件开发中的一套解决方 ...
- (转)项目迁移_.NET项目迁移到.NET Core操作指南
原文地址:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html 这篇文章,汇集了大量优秀作者写的关于" ...
- java之单元测试
这篇主要简单讲下java的单元测试 目录结构如下: 如图,其中1是需要被测试的功能:2是测试模块:3是单元测试需要的引入包: 1. 功能模块1中 Calculator 的代码: package cn. ...
- JSON省市区
省: [ { "ProID": 1, "name": "北京市", "ProSort": 1, "ProRem ...
- openwrt luci web分析
openwrt luci web分析 来源 https://www.jianshu.com/p/596485f95cf2 www/cbi-bin/luci #!/usr/bin/lua --cgi的执 ...
- VBA 字符串-相关函数(1-5)
Instr()函数 InStr()函数返回一个字符串第一次出现在一个字符串,从左到右搜索.返回搜索到的字符索引位置. 语法 InStr([start,]string1,string2[,compare ...
- 【Linux内核】CPU和线程
首先明确一个概念,Linux系统中甚至没有真正的线程.不过,可以认为Linux是系统的线程是内核线程,所有调度是基于线程的. 1.线程分类 一个进程由于其运行空间的不同, 从而有内核线程和用户进程的区 ...