HDU4623 CRIME 【状压DP】【同类项合并】
题目大意:
求相邻元素互质的排列个数。
题目分析:
由于互质只与质因数有关,所以我们对于质因数种类相同的数合并为一类,特殊的,1,17,19,23是一类,因为没有数与他们不互质。
那么我们做各个位进制不同的状压DP。转移就是在末尾添加哪个数。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std; #define P __gcd int n,mod;
int tot,res,maxx; int GCD[][];
int a[];
//1,2,3,5,2*3,7,2*5,11,13,2*7,3*5,3*7,2*11,2*13
int bel[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
int data[]={,,,,,,,,,,,,,};
int sum[];
int fac[]={,,,,,}; int f[][]; void GetSubSet(){
memset(a,,sizeof(a));maxx=;
for(int i=;i<=n;i++) a[bel[i]]++,maxx=max(maxx,bel[i]);
sum[] = ;
for(int i=;i<=maxx;i++) sum[i] = sum[i-]*a[i-]+sum[i-];
} vector<int> v[];
void dfs(int now,int dd,int num){
if(now > maxx){
v[num].push_back(dd);
}else{
for(int i=;i<=a[now];i++){
dfs(now+,dd+i*sum[now],num+i);
}
}
} int nw[];
void work(){
for(int i=;i<=maxx;i++) f[sum[i]][i] = ;
for(int i=;i<=n;i++) v[i].clear();
dfs(,,);
for(int i=;i<n;i++){
for(int j=;j<v[i].size();j++){
int p=v[i][j];
for(int k=maxx;k>=;k--){nw[k] = p/sum[k];p%=sum[k];}
p = v[i][j];
for(int k=;k<=maxx;k++){
if(nw[k] == || f[p][k]==) continue;
for(int l=;l<=maxx;l++){
if(a[l]-nw[l] == ||GCD[l][k]!=) continue;
f[p+sum[l]][l] += f[p][k];
f[p+sum[l]][l] %= mod;
}
}
}
}
int ans = ;
for(int i=;i<=maxx;i++) ans = (ans+f[v[n][]][i])%mod;
for(int i=;i<=maxx;i++)
ans=(ans*fac[a[i]])%mod;
printf("%d\n",ans);
} int main(){
int t; scanf("%d",&t);
for(int i=;i<;i++)for(int j=;j<;j++)GCD[i][j]=P(data[i],data[j]);
while(t--){
scanf("%d%d",&n,&mod);
memset(f,,sizeof(f));
GetSubSet();
work();
}
return ;
}
HDU4623 CRIME 【状压DP】【同类项合并】的更多相关文章
- [BZOJ4565][HAOI2016]字符合并(区间状压DP)
https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最 ...
- ZOJ3802 Easy 2048 Again (状压DP)
ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- 状压DP uvalive 6560
// 状压DP uvalive 6560 // 题意:相邻格子之间可以合并,合并后的格子的值是之前两个格子的乘积,没有合并的为0,求最大价值 // 思路: // dp[i][j]:第i行j状态下的值 ...
- zoj3802:easy 2048 again(状压dp)
zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...
- hdu4778:状压dp+博弈
题目大意: 有g种不同颜色的小球,b个袋子,每个袋子里面有若干个每种小球 两人轮流取袋子,当袋子里面的同色小球有s个时,会合并成一个魔法球,并被此次取袋子的人获得 成功获得魔法球的人可以再次取 求二者 ...
- BZOJ 2064: 分裂( 状压dp )
n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...
- [WC2008]游览计划(状压dp)
题面太鬼畜不粘了. 题意就是给一张n*m的网格图,每个点有点权,有k个关键点,让你把这k个关键点连成一个联通快的最小代价. 题解 这题nmk都非常小,解法肯定是状压,比较一般的解法插头dp,但不太好写 ...
- 2018.10.24 bzoj2064: 分裂(状压dp)
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
- 分裂 BZOJ2064 状压DP
分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小 ...
随机推荐
- three.js - 添加材质 灯光 阴影
看下运行效果: 源码解释: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 看进程的启动时间长度 + vmstat + jstack 应用
1.显示进程已运行的时间 $ ps -e -o pid,comm,etime 2.dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现 ...
- Unity 协程停不了?
你是不是遇到过协程停不了的情况?你是直接调用IEnumerator方法,如下? void Start () { StartCoroutine(IETest01()); StartCoroutine(I ...
- 初识Identity(一)
一.Authentication(身份验证)和Authorization(授权) 如何构建安全的web应用?authentication和authorization是asp.net中最重要最基本的防护 ...
- Vue-Vue列表渲染v-for
v-for 指令需要以 site in sites 形式的特殊语法 一.v-for 循环数组 HTML代码 <div id="app"> <ul> < ...
- 获取2个集合List<T>的共同元素
获取2个集合List<T>的共同元素,循环2个集合,然后比对. class Bj { public void GetIntersect() { , , , , , , }; , , , , ...
- Bootstrap Search Suggest 下拉框模糊查询
源码地址:https://github.com/lzwme/bootstrap-suggest-plugin 有时间会完善!暂时有点忙!
- Luogu P4137 Rmq Problem / mex
区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...
- 【APIO2016】烟火表演
题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...
- FFMPEG指令
FFmpeg是一个用于音视频处理的自由软件,被广泛用于音视频开发.FFmpeg功能强大,本文主要介绍如何使用FFmpeg命令行工具进行简单的视频处理. 安装FFmpeg可以在官网下载各平台软件包或者静 ...