题目大意:

求相邻元素互质的排列个数。

题目分析:

由于互质只与质因数有关,所以我们对于质因数种类相同的数合并为一类,特殊的,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】【同类项合并】的更多相关文章

  1. [BZOJ4565][HAOI2016]字符合并(区间状压DP)

    https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最 ...

  2. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  3. 状压DP uvalive 6560

    // 状压DP uvalive 6560 // 题意:相邻格子之间可以合并,合并后的格子的值是之前两个格子的乘积,没有合并的为0,求最大价值 // 思路: // dp[i][j]:第i行j状态下的值 ...

  4. zoj3802:easy 2048 again(状压dp)

    zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...

  5. hdu4778:状压dp+博弈

    题目大意: 有g种不同颜色的小球,b个袋子,每个袋子里面有若干个每种小球 两人轮流取袋子,当袋子里面的同色小球有s个时,会合并成一个魔法球,并被此次取袋子的人获得 成功获得魔法球的人可以再次取 求二者 ...

  6. BZOJ 2064: 分裂( 状压dp )

    n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...

  7. [WC2008]游览计划(状压dp)

    题面太鬼畜不粘了. 题意就是给一张n*m的网格图,每个点有点权,有k个关键点,让你把这k个关键点连成一个联通快的最小代价. 题解 这题nmk都非常小,解法肯定是状压,比较一般的解法插头dp,但不太好写 ...

  8. 2018.10.24 bzoj2064: 分裂(状压dp)

    传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...

  9. 分裂 BZOJ2064 状压DP

    分析: 这个题很好啊,比起什么裸的状压DP高多了! 我们可以考虑,什么时候答案最大:全合并,之后再分裂 这样,我们必定可以得到答案,也就是说答案必定小于n+m 那么我们可以考虑,什么时候能够使答案更小 ...

随机推荐

  1. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  2. 在属性property做一些简单的验证

    开发C#的程序,写到属性property时,我们可以在Set方法中做一些简单的规则验证: 如下面,Insus.NET写一个Age属性,只允许用户输入10以内的数字: class AA { privat ...

  3. 关于 CSLA 服务器部署WCF访问出错的问题

    MDAA项目 在以前的项目中,只要部署,从来没有发生过 通过WCF访问出错的问题,但是此次却出现如下问题: 2018-04-21 13:45:39,744 [119] ERROR Galaxy.OTC ...

  4. [Python]Hamming distance 问题

    In [75]: x=4 In [76]: y=1 In [77]: str(bin(x ^ y))[2:].count('1') Out[77]: 2 In [78]: 来自:https://lee ...

  5. 【精】【入门篇】js正则表达式

    前言 最近有了点时间,就回头看了一下<学习正则表达式>这本书.怎么说呢,这本书适合从零开始学习正则表达式或者有一点基础但是想要加强这方面能力的读者.这本书的风格是“实践出真知”,使用归纳方 ...

  6. VMware workstation运维实践系列博客导航

    第一章:VMware workstation虚拟化1.1 VMware workstation计算网络存储介绍1.2 VMware workstation其他功能特性介绍1.3 VMware work ...

  7. NTP系统时间同步-操作记录

    在初始化一台linux服务器后,发现这台服务器的时间不对[root@dev ~]# date2016年 10月 11日 星期二 07:04:34 CST Linux时钟分为系统时钟 (System C ...

  8. c#词频统计命令行程序

    这里将用c#写一个关于词频统计的命令行程序. 预计时间分配:输入处理3h.词条排序打印2h.测试3h. 实际时间分配:输入处理1h.词条排序打印2h.测试3h.程序改进优化6h. 下面将讲解程序的完成 ...

  9. Java提高篇(1)封装

    三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...

  10. Sprint第三个计划

    这一次是最后的一个阶段,承上启下.这一阶段我们将转向Android的主要设计.加油,最后十天.