Crime

题目链接:HDU - 4623

题意:将1~n,n个数重新排列组合,使得每相邻的两个数互质;问总共有多少中方案;

思路:n最大是28,首先想到状压DP,2^28=268435456,肯定会爆栈;所以还需要优化一下;通过观察可以发现,质因子相同的数可以看做一类;也就是说,6, 12, 24可以放到一组中,用一位表示,那么,将28个数分组后就构成了每个位不同进制的数字,由计算的共state=1727999种状态;时间复杂度:O(state*28*28), 大约1354751216;

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6;
//Ꮧ对1~28分组,有相同质因子的为一组,又1, 17, 19, 23与任何数互质,所以将其分为一组,在同一组有相同的对外性;
int group[]={0, 0, 1, 2, 1, 3, 4, 5, 1, 2, 6, 7, 4, 8, 9, 10, 1, 0, 4, 0, 6, 11, 12, 0, 4, 3, 13, 2, 9};
//提取每一组的代表数;
int digit[]={1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 21, 22, 26};
//prime[i][j]表示i组的数与j组的是否互质;
bool prime[20][20];
int gcd(int a, int b){return b==0?a:gcd(b, a%b);
}
//初始化prime数组;
void init(){//这里为什么i,j都是0~13?可以保留疑问,继续向下看;for(int i=0; i<14; i++){for(int j=0; j<14; j++){prime[i][j]=(gcd(digit[i], digit[j])==1?1:0);}}
}
//bit[i]表示i位是bit[i]进制, num表示给出的范围总共包括的组数,也就表示一共有多少位;
int bit[20], dp[maxn][20], num, mod;
//计算cnt数组的状态下,表示的十进制数;cnt[i]表示第i为是cnt[i];
int get_state(int *cnt){int state=0;for(int i=0; i<=num; i++){state=state*bit[i]+cnt[i];}return state;
}
//计算在state状态下的cnt数组;
void get_cnt(int state, int *cnt){for(int i=num; i>=0; i--){cnt[i]=state%bit[i];state/=bit[i];}
}
//suf[i]表示在第i位加1,十进制数增加suf[i];
int suf[20];
void get_suf(){suf[num]=1;for(int i=num-1; i>=0; i--){suf[i]=suf[i+1]*bit[i+1];}
}
int solve(int state){memset(dp, 0, sizeof(dp));get_suf();int cnt[20];memset(cnt, 0, sizeof(cnt));for(int i=0; i<=num; i++){cnt[i]=1;dp[get_state(cnt)][i]=bit[i]-1;cnt[i]=0;}for(int k=1; k<=state; k++){get_cnt(k, cnt);for(int i=0; i<=num; i++){if(cnt[i]==0) continue;//如果i位没有选数就跳过;这里表示在state状态下最后选的是i组的数,再选下一个数;for(int j=0; j<=num; j++){if(!prime[i][j]||cnt[j]>=bit[j]-1) continue;//如果i,j组数不互质或者j组无数可选了,就不选j组数;细心的朋友会发现0组咋办?即如果之前选了1,此时还能选19,所以prime[0][0]是等于1的;int s=k+suf[j];dp[s][j]=(dp[s][j]+dp[k][i]*(bit[j]-cnt[j]-1)%mod)%mod;}}}int ans=0;for(int i=0; i<=num; i++){ans=(ans+dp[state][i])%mod;}return ans%mod;
}
int main(){int T;scanf("%d", &T);init();while(T--){int n;scanf("%d%d", &n, &mod);num=0;for(int i=1; i<=n; i++){num=max(num, min(i, group[i]));}int cnt[20];memset(cnt, 0, sizeof(cnt));for(int i=1; i<=n; i++){cnt[group[i]]++;}for(int i=0; i<=num; i++){bit[i]=cnt[i]+1;}printf("%d\n", solve(get_state(cnt)));}return 0;
}

Crime HDU - 4623(状压DP,不同进制转换)相关推荐

  1. hdu 1074 状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...

  2. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  3. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  4. hdu 4937 Lucky Number(数学题 进制转换)2014多校训练第7场

    Lucky Number                                                                          Time Limit: 20 ...

  5. HDU 5045 状压DP 上海网赛

    比赛的时候想的是把n个n个的题目进行状压 但这样不能讲究顺序,当时精神面貌也不好,真是挫死了 其实此题的另一个角度就是一个n个数的排列,如果我对n个人进行状压,外面套一个按题目循序渐进的大循环,那么, ...

  6. hdu 4640(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...

  7. hdu 4539(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 思路:跟poj1185简直就是如出一辙! 1 #include<iostream> ...

  8. hdu 4284(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 思路:类似于poj3311:http://poj.org/problem?id=3311,首先f ...

  9. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  10. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

最新文章

  1. 瑞雪时晴,不亦快哉 ——图灵十一月月刊
  2. iOS -OC调用js页面
  3. java 怎么判别注释符_java学习笔记二(注释、关键字、标识符)
  4. 校长回应8名考生放弃清华北大:不喜欢学医才去其他
  5. 深度学习attention原理_深度学习Anchor Boxes原理与实战技术
  6. 锐捷交换机实验案例:vlan间互访的配置与验证
  7. ASH的适用场景和常见用法(附2个经典案例)
  8. 20121022 django学习笔记1
  9. 转 LCD的接口类型详解
  10. 机器学习笔记(二十一):决策边界
  11. 京东价格监控软件开发技术探讨八:如何获取京东商品分类数据
  12. android电视 怎么调电视机的信号源,电视怎么调信号源
  13. #9733;如何解释特修斯之船问题?
  14. html种颜色的三种不同表示方法,html网页背景颜色的代码是什么?颜色有几种表示方法?...
  15. RSTP Proposal-Agreement
  16. react navigation 中使用goBack()跳转到指定页面
  17. 求职招聘微信小程序源码下载v4.1.78 修复首页授权空白问题
  18. 响铃:互金信贷的明天,或是一场一站式金融服务的盛宴
  19. em标签和i标签区别
  20. 未来的主流NewIT,埃森哲最佳实践

热门文章

  1. 【小工具】文件夹映射为本地磁盘(重启不失效)
  2. Android拓展系列(5)--CyanogenMod源码下载和编译(Android ROM定制基础篇)
  3. 打开网页速度慢的原因和解决方法
  4. MAC OS搭建pyhton+selenium+pycharm实现web自动化测试
  5. 金蝶迷你版所有数据引出excel没有反应,如何处理
  6. NYOJ题目54 小明的存钱计划
  7. 红帽子Linux7安装Oracle,RedHat Enterprise Linux7.0安装Oracle 12C
  8. atitit..国富论 在现代it企业项目管理中的作用attialx 总结---国富论读后感 attialx...
  9. android下拉水波纹,android自定义WaveView水波纹控件
  10. android中数据统计,Android 友盟统计集成