限制相邻元素,求合法序列数。
/**
题目:On the Bench
链接:http://codeforces.com/problemset/problem/840/C
题意:求相邻的元素相乘不为平方数的方案数(这里求得是排列方案数,所以哪怕数相同,只要位置不同也算一种方案) 思路 :
每个数可以表示为 p1^a1 * p2^a2 * .....
如果 两个数A,B相乘为平方数 则 a1%2 = a1' %2 , a2%2 = a2'%2 .....
即 对应质因子的幂次 奇偶性相同 这样就可以划分出T组
然后题目就转化为 T种物品 相同种类物品不能放在相邻 求方案数
这题就变成原题 :https://csacademy.com/contest/archive/task/distinct_neighbours/statement/
http://acm.hdu.edu.cn/showproblem.php?pid=6116
做法为dp
dp[i][j] 表示插入第 i 组的物品 出现了左右为相同物品的空隙个数为 j 的方案数 那 dp[T][0]*mul 就是最终答案了; mul表示每一组的数都可以排列;哪怕是相同的数由于位置不同,仍然可以排列; 转自:http://www.cnblogs.com/orz010orz/p/7398692.html */
#include<bits/stdc++.h>
#define LL long long
#define ms(x,y) memset(x,y,sizeof x)
#define ls(i) seg[i].lc
#define rs(i) seg[i].rc
using namespace std;
typedef pair<int,int> pii;
const int maxn = ;
const int mod = 1e9+;
const LL INF = 1e12 + ;
int cnt[maxn], sum[maxn];
LL dp[maxn][maxn];
LL c[][];
int a[maxn], n, m, vis[maxn];
int fac[maxn];
void init(){
c[][] = ;
for(int i = ; i < maxn; i++){
c[i][] = ;
for(int j = ; j <= i; j++){
c[i][j] = (c[i-][j-]+c[i-][j])%mod;
}
}
fac[] = ;
for(int i = ; i < maxn; i++) fac[i] = (LL)fac[i-]*i%mod;
}
bool ok(LL x)
{
LL lo = , hi = 1e9, mi, ans = ;
while(lo<=hi){
mi = (lo+hi)/;
if(mi*mi>=x) hi = mi-, ans = mi;
else lo = mi+;
}
return ans*ans==x;
}
int cmp(int a,int b)
{
return a>b;
}
void getCnt()
{
m = ;
ms(cnt,);
ms(vis,);
for(int i = ; i <= n; i++){
if(vis[i]) continue;
++m;
cnt[m]++;
for(int j = i+; j <= n; j++){
if(vis[j]) continue;
///judge a[i], a[j] is equal?
if(ok(1LL*a[i]*a[j])){///judge(i,j)
cnt[m]++;
vis[j] = ;
}
}
}
}
int main()
{
init();
while(scanf("%d",&n)==)
{
for(int i = ; i <= n; i++){
scanf("%d",&a[i]);
}
getCnt();
n = m;
LL mul = ;
for(int i = ; i <= n; i++){
sum[i] = sum[i-]+cnt[i];
mul = mul*fac[cnt[i]]%mod;
}
ms(dp,);
if(cnt[]>)
dp[][cnt[]-] = ;
for(int i = ; i <= n; i++){
for(int j = ; j <= sum[i]-; j++){
if(!dp[i-][j]) continue;
for(int k = ; k <= cnt[i]; k++){
for(int z = ; z <= k&&z<=j; z++){
LL res = dp[i-][j]*c[j][z]%mod*c[cnt[i]-][k-]%mod*c[sum[i-]+-j][k-z]%mod;
dp[i][j-z+cnt[i]-k] = (dp[i][j-z+cnt[i]-k]+res)%mod;
}
}
}
}
cout<<dp[n][]*mul%mod<<endl;
}
return ;
}

codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。的更多相关文章

  1. Codeforces 840C. On the Bench 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF840C.html 题解 首先,我们可以发现,如果把每一个数的平方因子都除掉,那么剩下的数,不相等的数都可以相 ...

  2. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

  3. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  4. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  5. G.subsequence 1(dp + 排列组合)

    subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...

  6. [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)

    [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...

  7. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  8. LightOJ1005 Rooks(DP/排列组合)

    题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0 ...

  9. HDU 5816 状压DP&排列组合

    ---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

随机推荐

  1. PHP快速入门 如何配置Apache服务器

    点击安装Apache,一直下一步 填写域名(Network Domain),服务器名(Server Name),和管理员邮箱(三条都可以任意填写) 下一步的时候选择(Custom),然后在Apache ...

  2. JDK1.5 AtomicLong实例

    JDK1.5 AtomicLong实例 类 AtomicLong 可以用原子方式更新的 long 值.有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范.A ...

  3. mac中使用vi修改二进制文件

    mac中使用vi修改二进制文件 1.首先以二进制方式编辑这个文件vi -b datafile 2.使用xxd转换为16进制:%!xxd 文本看起来像这样: 0000000: 1f8b 0808 39d ...

  4. PHP项目的“苦逼”经历与思考

    PHP项目的"苦逼"经历与思考 PHP零基础.但因为项目人手不够的原因,被安排到一个用户"定制"项目. 该项目是用PHP生成的统计数据报表. 而用户又有新的3个 ...

  5. 【Oracle】Oracle常用语句集合

    表相关 1.快速统计大表记录数 select table_name, t.num_rows, t.last_analyzed  from tabs t WHERE table_name='TABLE_ ...

  6. Cookie的介绍

    Cookie是某些站点为了辨别用户身份而存在用户本地终端上的数据.Cookie总是保存在client中,可分为内存 Cookie和硬盘Cookie,而依照时间划分.又能够分为非持久Cookie和持久C ...

  7. CI:关于计算智能

    该书认为,当前的计算智能起源于人工智能和生物智能.人工智能的起源大约可以追溯到50年以前,而计算智能这个术语则仅仅出现于10年以前.计算智能由几个部分组成,即人工智能.模糊集和模糊逻辑.神经网络(有时 ...

  8. 机器学习基石第三讲:types of learning

    博客已经迁移至Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完毕机器学习基石的第三讲.这一讲主要介绍了机器学习的分类.对何种问题应该使用何种 ...

  9. scanf深究

    例子: #include <stdio.h>#include <string.h> main(){ char buffer[1024]; scanf("%s" ...

  10. 删除mysql数据库表里的记录

    如果记录不再需要,可以用delete 命令进行删除,语法如下: DELETE FROM tablename [WHERE CONDITION] 例如,在emp 中将ename 为‘dony’的记录全部 ...