Free from square

Problem Description
There is a set including all positive integers that are not more then n. HazelFan wants to choose some integers from this set, satisfying: 1. The number of integers chosen is at least 1 and at most k. 2. The product of integers chosen is 'free from square', which means it is divisible by no square number other than 1. Now please tell him how many ways are there to choose integers, module 10^9+7.
 
Input
The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.
For each test case:
A single line contains two positive integers n,k(1≤n,k≤500).
 
Output
For each test case:
A single line contains a nonnegative integer, denoting the answer.
 
Sample Input
2
4 2
6 4
 
Sample Output
6
19
 
题解:
  n个数
  首先你明白,1~n个数,没有数是包含超过两个 大于根号n 的质因子的,
  小于根号n的质因子只有8个,所以做这个题的思路就有了
  对于只含有小于根号n的 那些质因子的那些数,我们状态压缩DP就好了
  对于包含大于根号n 的 那些质因子的 那些数,我们分组背包, 也就是说 某些包含同一个 大于根号n的 因子 放在一组里边
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. typedef unsigned long long ULL;
  11. const long long INF = 1e18+1LL;
  12. const double pi = acos(-1.0);
  13. const int N = 5e2+, M = 1e3+,inf = 2e9,mod = 1e9+;
  14.  
  15. int p[] = {,,,,,,,};
  16. vector<int > fi,se[N];
  17. int dp[][N][(<<)+],f[N];
  18.  
  19. int solve(int n,int K) {
  20. fi.clear();
  21. memset(dp,,sizeof(dp));
  22. for(int i = ; i <= n; ++i) se[i].clear(),f[i] = ;
  23. fi.push_back();
  24. for(int i = ; i <= n; ++i) {
  25. int tmp = i,now = ,ok = ;
  26. for(int j = ; j < ; ++j) {
  27. int _ = ;
  28. while(tmp % p[j] == ) _++,now|=(<<j),tmp/=p[j];
  29. if(_ >= ) ok = ;
  30. }
  31. if(ok) {
  32. f[i] = now;
  33. if(tmp!=) se[tmp].push_back(i);
  34. else fi.push_back(i);
  35. }
  36. }
  37. int now = ;
  38. dp[][][] = ;
  39. for(int i = ; i < fi.size(); ++i) {
  40.  
  41. now ^= ;memset(dp[now],,sizeof(dp[now]));
  42. for(int k = ; k <= K; ++k) {
  43. for(int j = ; j < (<<); ++j) {
  44.  
  45. dp[now][k][j] += dp[now^][k][j];
  46. dp[now][k][j] %= mod;
  47.  
  48. if((j&f[fi[i]])) continue;
  49.  
  50. dp[now][k+][j|f[fi[i]]] += dp[now^][k][j];
  51. dp[now][k+][j|f[fi[i]]] %= mod;
  52.  
  53. }
  54. }
  55. }
  56.  
  57. for(int i = ; i <= n; ++i) {
  58. if(se[i].size() == ) continue;
  59. // cout<<"shit"<<endl;
  60. now^=;memset(dp[now],,sizeof(dp[now]));
  61. for(int h = ; h <= K; ++h) {
  62. for(int k = ; k < (<<); ++k) {
  63.  
  64. dp[now][h][k] += dp[now^][h][k];
  65. dp[now][h][k] %= mod;
  66.  
  67. for(int j = ; j < se[i].size(); ++j) {
  68. if((f[se[i][j]]&k)) continue;
  69. dp[now][h+][f[se[i][j]]|k] += dp[now^][h][k];
  70. dp[now][h+][f[se[i][j]]|k] %= mod;
  71. }
  72. }
  73. }
  74. }
  75.  
  76. int ans = ;
  77. for(int i = ; i <= K; ++i) {
  78. for(int j = ; j < (<<); ++j)
  79. ans += dp[now][i][j],ans %= mod;
  80. }
  81. return ans;
  82. }
  83.  
  84. int main() {
  85. int T,n,k;
  86. scanf("%d",&T);
  87. while(T--) {
  88. scanf("%d%d",&n,&k);
  89. printf("%d\n",solve(n,k));
  90. }
  91. return ;
  92. }
  93. /*
  94. 2
  95. 4 2
  96. 6 4
  97. */

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

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

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

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

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

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

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

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

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

  5. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  6. HDU 1074 Doing Homework (状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

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

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

  8. HDU 1074 Doing Homework ——(状态压缩DP)

    考虑到n只有15,那么状压DP即可. 题目要求说输出字典序最小的答案的顺序,又考虑到题目给出的字符串本身字典序是递增的,那么枚举i的时候倒着来即可.因为在同样完成的情况下,后选字典序大的,小的字典序就 ...

  9. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

随机推荐

  1. [jenkins学习篇] 安装jenkins

    1 下载war包,https://jenkins.io/download/ 2 安装jar包,java -jar jenkins.war 3 打开网址:http://localhost:8080 4 ...

  2. Android隐藏软键盘收回软键盘

    代码改变世界 Android隐藏软键盘收回软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPU ...

  3. 算法复习——数位dp(不要62HUD2089)

    题目 题目描述 杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司 ...

  4. mybatis学习(二)——环境搭建

    开发环境搭建主要包括以下几步 1.新建一个JAVA项目(可以只建一个文件夹)  2.导入jar包 log4j是一个日志包,可以不加,这里为了定位问题添加了该包,下面两个包必须需要. 3.创建数据库 C ...

  5. ES6的一些说明

    一 ES6 即 ECMAScript6 ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可 ...

  6. 关于虚拟机IP网段和公司内网网段的问题?

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>    请教一个问题,为了解决电脑换网络环境就连不上虚拟机的问题,我虚拟机使用的nat模式,我的VMnet8IP是192 ...

  7. Yii 之cookie的使用

    public function actionIndex(){ //设置cookie(注意这里用的是响应组件) $cookies = \YII::$app->response->cookie ...

  8. Redis命令行之Zset

    一.Redis之Zset简介 1. 有序集合Zset是String类型的有序集合. 2. Zset中每个元素都会关联一个double类型的分数值,redis通过分数值来为集合中所有成员进行从小到大排序 ...

  9. 模拟用户登录-SpringMVC+Spring+Mybatis整合小案例

    1. 导入相关jar包 ant-1.9.6.jarant-launcher-1.9.6.jaraopalliance.jarasm-5.1.jarasm-5.2.jaraspectj-weaver.j ...

  10. SGU104 二维dp

    大致题意: n个东西放在(1.2.3...m)个容器中,先放的必需在后方的左边.a[i][j]表示i号物品放在j容器所得 的价值,求最大价值. 几乎是刚刚开始接触动态规划题,开始我这样想 每个东西一件 ...