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: ...
随机推荐
- [转] ABP框架Web API跨域问题的解决方案
原文地址:https://www.cnblogs.com/farb/p/ABPWebAPICrossDomain.html 1.在Web Api 项目下安装 Microsoft.AspNet.Web ...
- KMP操作大全与kuangbin kmp套题题解
先搬运,比赛后整理 https://blog.csdn.net/vaeloverforever/article/details/82024957
- Apache Kafka Consumer 消费者集
1.目标 在我们的上一篇文章中,我们讨论了Kafka Producer.今天,我们将讨论Kafka Consumer.首先,我们将看到什么是Kafka Consumer和Kafka Consumer的 ...
- urlencode编码 — 为什么要编码
原文链接:https://blog.csdn.net/stpeace/article/details/82892571 参考:https://blog.csdn.net/z69183787/artic ...
- 5. JDBC/ODBC服务器
Spark SQL也提供JDBC连接支持,这对于让商业智能(BI)工具连接到Spark集群上以及在多用户间共享一个集群的场景都非常有用.JDBC服务器作为一个独立的Spark驱动器程序运行,可以在多用 ...
- 协议——IIC
I²C即Inter-Integrated Circuit(集成电路总线),它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代设计出来的一种简单.双向.二线制总线标准.多用于主机和从机在数 ...
- 14-4 ADO.NET简介2
14-4-1Connection连接.关闭数据库 1.为了访问数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的.它有 四种类型的连接方式: SQLConnection AD ...
- Python接口自动化基础---get请求
1.没有参数的get请求 import requests r=requests.get('http://docs.python-requests.org/zh_CN/latest/user/quick ...
- 【洛谷 P3804】 【模板】后缀自动机
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- python day 11: 类的补充,元类,魔法方法,异常处理
目录 python day 11 1. 类的补充 1.1 通过反射来查找类,创建对象,设置对象的属性与方法 1.2 类的魔法方法:getitem,setitem 1.3 元类__metaclass__ ...