题目大意:

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

题目分析:

由于互质只与质因数有关,所以我们对于质因数种类相同的数合并为一类,特殊的,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. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽)

    1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽) https://v.youku.com/v_show/id_XNDE0Njk3Njg2OA==. ...

  2. GIT 分支管理:多人协作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ git r ...

  3. sql实时提交事务

    public void deleteByHbtlidAndDept(String class_id,String depart_id) { Session session = this.getHibe ...

  4. [Spark][Python]Spark Join 小例子

    [training@localhost ~]$ hdfs dfs -cat people.json {"name":"Alice","pcode&qu ...

  5. 【C++】std::是什么?

    引例: #include<iostream> int main() { std::cout<<"我喜欢C++";//输出一句话 std::cout<& ...

  6. Linux下针对服务器网卡流量和磁盘的监控脚本

    1)实时监控网卡流量的通用脚本: [root@ceph-node1 ~]# cat /root/net_monit.sh #!/bin/bash PATH=/bin:/usr/bin:/sbin:/u ...

  7. UPC-5063-二分图最大匹配

    好吧二分图的最小点覆盖=最大匹配 这道题也就变成模板题了... 写一个提醒,在写二分图时,尽量清零操作清空为-1,比如这个题,匹配数组girl[]如果清空为0,代表每个点都与0点连接,但是实际上是并没 ...

  8. linux内核分析第六次实验

    使用gdb跟踪创建新进程的过程 rm menu -rf git clone https://github.com/mengning/menu.git  mv test_fork.c test.c  执 ...

  9. github的使用心得

    我的github地址:https://github.com/gaino1/test GitHub 是一个用于使用Git版本控制系统的项目的基于互联网的存取服务. GitHub可以托管各种git库,并提 ...

  10. NODE中解决跨域请求的问题

    1.Node Express 解决请求跨域请求 标签(空格分隔): 跨域 1是Access-Control-Allow-Origin 允许的域 2是Access-Control-Allow-Heade ...