http://acm.hdu.edu.cn/showproblem.php?pid=6125

题意:

在${1,2,3,...n}$的数中选择1~k个数,使得它们的乘积不能被平方数整除(1除外),计算有多少种取法。

思路:

考虑一下他们的质因子,如果两个数有相同的质因子,那么它们两个肯定是不能同时选的。这是不是很像分组背包,但是如果以质因子来分类的话,一个数就可能处于多个背包当中,这样就不行了,因为一个数你只能在一个背包中。

这题的数据范围很小,在500的范围内,质数的平方数小于500的就8个数,${2,3,5,7,11,13,17,19}$,那我们就可以二进制压缩来记录每个数的质因子情况,当然了,大于19的质因子每个数最多只会有一个。这样的话到最后就能很方便的划分背包了。

最后分组背包求解。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+;
const int mod=1e9+; int n, k;
int prime[]={,,,,,,,};
int st[maxn];
int dp[maxn][maxn];
int leave[maxn];
vector<int> v[maxn]; void solve()
{
memset(st,,sizeof(st));
for(int i=;i<=n;i++) leave[i]=i;
for(int i=;i<=n;i++)
{
for(int j=;j<;j++)
{
if(st[i]==-) break;
if(i%prime[j]== && i%(prime[j]*prime[j])!=)
st[i]|=<<j, leave[i]/=prime[j];
else if(i%(prime[j]*prime[j])==)
st[i]=-;
}
}
for(int i=;i<=n;i++) v[i].clear();
for(int i=;i<=n;i++)
{
if(st[i]==-) continue;
if(leave[i]==) v[i].push_back(i);
else v[leave[i]].push_back(i);
}
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++)
{
if(st[i]==- || v[i].size()==) continue;
for(int j=k-;j>=;j--)
{
for(int s=;s<(<<);s++)
for(int t=;t<v[i].size();t++)
{
int id=v[i][t];
if((s&st[id])==)
dp[j+][s|st[id]]=(dp[j+][s|st[id]]+dp[j][s])%mod;
}
}
} ll ans=;
for(int i=;i<=k;i++)
{
for(int s=;s<(<<);s++)
ans=(ans+dp[i][s])%mod;
}
cout<<ans<<endl;
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
solve();
}
return ;
}

HDU 6125 Free from square(状态压缩+分组背包)的更多相关文章

  1. hdu 6125 -- Free from square(状态压缩+分组背包)

    题目链接 Problem Description There is a set including all positive integers that are not more then n. Ha ...

  2. HDU 6125 Free from square 状态压缩DP + 分组背包

    Free from square Problem Description There is a set including all positive integers that are not mor ...

  3. HDU 1170 Shopping Offers 离散+状态压缩+完全背包

    题目链接: http://poj.org/problem?id=1170 Shopping Offers Time Limit: 1000MSMemory Limit: 10000K 问题描述 In ...

  4. HDU 6125 Free from square (状压DP+背包)

    题意:问你从 1 - n 至多选 m 个数使得他们的乘积不能整除完全平方数. 析:首先不能整除完全平方数,那么选的数肯定不能是完全平方数,然后选择的数也不能相同的质因子. 对于1-500有的质因子至多 ...

  5. HDU 6125 - Free from square | 2017 Multi-University Training Contest 7

    思路来自这里 - - /* HDU 6125 - Free from square [ 分组,状压,DP ] | 2017 Multi-University Training Contest 7 题意 ...

  6. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  7. 【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp

    题目描述 Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the farm. Far ...

  8. HDU 6125 Free from square (状压DP+分组背包)

    题目大意:让你在1~n中选择不多于k个数(n,k<=500),保证它们的乘积不能被平方数整除.求选择的方案数 因为质数的平方在500以内的只有8个,所以我们考虑状压 先找出在n以内所有平方数小于 ...

  9. HDU 3681 Prison Break(状态压缩dp + BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...

随机推荐

  1. 【深入理解javascript】this的用法

    引用:this的用法 在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了 情况1:构造函数 函数作为构造函数用,那么其中的this就代表它即将new出来的对象.另外 ...

  2. [vue]vue-book

    我们打算要做这几个模块 首页 列表 收藏 添加 home.vue --> list.vue -->app.vue --> main.js 安装环境 npm i vue-cli -g ...

  3. plsql的sql窗口中文模糊查询没有作用

    环境变量新增: NLS_LANG = AMERICAN_AMERICA.AL32UTF8

  4. python3与mysql:创建表、插入数据54

    import pymysql db = pymysql.connect(host=',db='jodb1',port=3307,charset='utf8') # #测试连接开发库成功 # db = ...

  5. jxl(Java Excel API) 使用方法 【2】

    JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该 API非Win ...

  6. zw版【转发·台湾nvp系列Delphi例程】HALCON SmallestRectangle2

    zw版[转发·台湾nvp系列Delphi例程]HALCON SmallestRectangle2 procedure TForm1.Button1Click(Sender: TObject);var ...

  7. 最短路径-----迪杰斯特拉算法(C语言版)

    原文:http://blog.csdn.net/mu399/article/details/50903876 转两张思路图非常好:   描述略   图片思路很清晰.  Dijkstra不适用负权值,负 ...

  8. Linux基础命令---chgrp

    chgrp 改变文件或者目录所属的群组,使用参数“--reference”,可以改变文件的群组为指定的关联文件群组. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.o ...

  9. git必备命令

    git status 查看git的状态git add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录.git add -u ...

  10. 深入hibernate的三种状态(转)

    hibernate的三种状态: 瞬时对象,持久化对象,托管对象. hibernate的两级缓存:1>一级缓存:session    2>二级缓存:sessionfactory. 瞬时对象: ...