限制相邻元素,求合法序列数。
/**
题目: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. 【java web】--css+div总结

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. 数据库:mongodb与关系型数据库相比的优缺点zz (转)

    与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值 ...

  3. Linux阅读笔记(一)

    1.关机命令 shutdown -h now             马上关机 shutdown -r now              马上重新启动 reboot                   ...

  4. Jquery重新学习之一[加载与属性html(),text(),val()]

    一:Jquery加载方式: 1:首先页面加载时马上响应JS代码如下运行(不一定要等所有的JS和图片加载完毕,就可以执行方法): $(document).ready(function(){ }); 另一 ...

  5. Python 创建包含列表的元组

    “可变”的tuple前面我们看到了tuple一旦创建就不能修改.现在,我们来看一个“可变”的tuple:>>> t = ('a', 'b', ['A', 'B'])注意到 t 有 3 ...

  6. 在 HTML 中使用JavaScript

    <script>元素 属性     async:可选.async 属性规定一旦脚本可用,则会异步执行,表示应该立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.a ...

  7. Java之字节码(1) - 深入解析

    转载地址 一:Java字节代码的组织形式 类文件{ OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域 ...

  8. js判断是否包含指定字符串

      CreateTime--2017年2月28日09:37:06Author:Marydonjs判断是否包含指定字符串 var inputValue = "thunder://piaohua ...

  9. 【Oracle】查看死锁与解除死锁

    1.查询死锁的进程(下面2条语句均可用) 语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.obj ...

  10. iOS主题/皮肤之SakuraKit

    概述 目前市场上很多 App 都有主题变更.皮肤切换的功能.随着项目代码量的不断增长,业务不断完善,功能性代码逐渐趋于模块化,尤其是在多人协作开发同一个项目时,模块解耦尤为重要,同时,公共基础库的功能 ...