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 那么我们可以考虑,什么时候能够使答案更小 ...
随机推荐
- 创建http.Server实例,端口占用就换个端口
/** * Created by Sorrow.X on 2017/10/25. */ const http = require('http'); const url = require('url') ...
- Luogu3676 小清新数据结构题 动态点分治
传送门 换根类型的统计问题动态点分治都是很好做的. 设所有点的点权和为$sum$ 首先,我们先不考虑求$\sum\limits_i s_i^2$,先考虑如何在换根的情况下求$\sum\limits_i ...
- React-redux-saga
新建sagas.js import { takeEvery , put} from 'redux-saga/effects' import axios from 'axios'; import { G ...
- How to Enable TLS 1.2 on Windows Server 2008 R2 and IIS 7.5
Nowadays there is an SSL vulnerability called POODLE discovered by Google team in SSLv3 protocol. So ...
- R绘图 第十一篇:统计转换、位置调整、标度和向导(ggplot2)
统计转换和位置调整是ggplot2包中的重要概念,统计转换通常使用stat参数来引用,位置调整通常使用position参数来引用. bin是分箱的意思,在统计学中,数据分箱是一种把多个连续值分割成多个 ...
- 从源码的角度再看 React JS 中的 setState
在这一篇文章中,我们从源码的角度再次理解下 setState 的更新机制,供深入研究学习之用. 在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 ...
- wordcount程序
wordcount程序算是相比于前几次作业来说比较难得一个作业了.进行了一次真的自己编写程序.WC程序实现了对txt文件中的数据的计数,算出程序中有多少单词.字符数以及行数.这次的程序编程是采用的C语 ...
- 11.13 Daily Scrum
今天在实现餐厅列表时,原来使用的百度地图poi搜索接口无法返回餐厅的具体信息. 经过一番周折,找到了一个返回餐厅url的接口.我们调整了一下实现,在点击餐厅列表的某一项点击直接跳到和该餐厅信息有关的网 ...
- 《linux内核设计与分析》内核模块编程
内核模块编程 一.准备工作 虚拟机:VMware Workstation 12操作系统:ubuntu当前内核版本:linux-headers-4.4.0-22-generic 二.有关于内核模块的知识 ...
- githup地址
githup地址:https://github.com/caowenjing/test.git