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. Mac下PHP7.1+Nginx安装和配置

    https://blog.csdn.net/haiyanggeng/article/details/79186982 PHP:7.1.13Nginx:1.12.2 1. 安装PHP# 添加源brew ...

  2. [javascript]编码&i字符串格式化&nput历史记录&清空模态框

    js中编码问题 https://www.haorooms.com/post/js_escape_encodeURIComponent 我在前端js添加时候创建dom时候,有汉字,发现是乱码就研究了下 ...

  3. logstash采集tomcat日志、mysql错误日志

    input{ file { path => "/opt/Tomcat7.0.28/logs/*.txt" start_position => "beginni ...

  4. [LeetCode] 476. Number Complement_Easy tag: Bit Manipulation

    这个题目思路就是比如101 的结果是010, 可以从111^101 来得到, 那么我们就需要知道刚好比101多一位的1000, 所以利用 while i <= num : i <<= ...

  5. Microsoft Interview第一轮

    上来随意交谈了一小会儿,开了点小玩笑,chat了一些关于他们recruter行程的话题,缓和了一下气氛. 进入正题,问了做的research的方向,我说是DLT,然后大概给他讲解了一下具体是什么, 跟 ...

  6. #C++初学记录(算法4)

    A - Serval and Bus It is raining heavily. But this is the first day for Serval, who just became 3 ye ...

  7. OAuth 白话简明教程 1.简述

    转自:http://www.cftea.com/c/2016/11/6702.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

  8. uva11865 朱刘算法+二分

    这题说的需要最多花费cost元来搭建一个比赛网络,网络中有n台机器,编号为0 - n-1其中机器0 为服务器,给了n条线有向的和他们的花费以及带宽 计算,使得n台连接在一起,最大化网络中的最小带宽, ...

  9. Linux命令: 编辑模式移动光标

    敲命令按以下顺序 ①vim filename ②e ③i ④ESC 移动光标 0 (零):将光标移动到行的起始处. $:将光标移动到行的末尾处. H:将光标移到当前窗口(而非全文)的第一行起始处. M ...

  10. Google's Machine Learning Crash Course #02# Descending into ML

    INDEX How do we know if we have a good line Linear Regression Training and Loss How do we know if we ...