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: ...
随机推荐
- OpenJudge 1088 滑雪
总时间限制: 1000ms 内存限制: 65536kB 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者 ...
- SpringBoot + Mybaties的逆向工程有数据库生成domain的过程
环境: jdk1.8 (适合springboot2.X以上版本) Maven(3.3.X以上) spring boot 2.1.6 Idea 2019.1\ 这里随便填 选择相应的Jar,如以下的勾 ...
- 07 XML知识点--学习笔记
1.XML概念:Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的. <user> <student> 功能 * 存储数据 1. 配 ...
- LeetCode977.Squares of a Sorted Array
题目 977. Squares of a Sorted Array Given an array of integers A sorted in non-decreasing order, retur ...
- quartz2.3.0(五)制定错过执行任务的misfire策略,用pause,resume模拟job暂停执行和继续执行
感谢兄台: <quartz-misfire 错失.补偿执行> misfire定义 misfire:被错过的执行任务策略 misfire重现——CronTrigger job任务类: pac ...
- Roads in the Kingdom CodeForces - 835F (直径)
大意: 给定一个基环树, 求删除一条环上的边使得直径最小. 直径分两种情况 环上点延伸的树内的直径 两个环上点的树内深度最大的点匹配 第一种情况直接树形dp求一下, 第二种情况枚举删除的环边, 线段树 ...
- lombok使用教程
Lombok介绍.使用方法和总结https://www.cnblogs.com/heyonggang/p/8638374.html Lombok简介.使用.工作原理.优缺点https://www.ji ...
- “http”和“https”的区别是什么?优缺点是什么?
1. http 的URL 以http:// 开头,https以https:// 开头. 2. http 标准端口是80 ,https是443. 3.https 协议需要到ca申请证书,http不需要. ...
- springMVC + mybatis 下出现JDBC Connection *** will not be managed by Spring错误
仔细查看配置中是否有如下类似的配置 execution(* com.ciguo.service.*.*(..)) <aop:config> <aop:pointcut id=&quo ...
- sql server 处理特殊字符问题
对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符, 同时 ...