限制相邻元素,求合法序列数。
/**
题目: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. 使用python读取word

    使用python读取word 官网:https://python-docx.readthedocs.io/en/latest/ 示例:https://blog.csdn.net/u010911997/ ...

  2. (剑指Offer)面试题53:正则表达式匹配

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  3. 理解 select poll epoll

    举例说明:老师收学生作业,相当于应用层调用I/O操作. 1.老师逐个收学生作业,学生没有做完,只能阻塞等待,收了之后,再去收下一个学生的作业.这显然存在性能问题. 2.怎么解决上面的问题? 老师找个班 ...

  4. Android程序怎么做单元测试

    如何进行Android单元测试 Menifest.xml中加入: <application>中加入: <uses-library android:name="android ...

  5. vb.net Bitmap Drawing

    Public Class Form1 Dim BMP As New Drawing.Bitmap(640, 480) Dim GFX As Graphics = Graphics.FromImage( ...

  6. taro 打包微信小程序运行失败(一)

    1.报错信息 thirdScriptError sdk uncaught third Error Cannot read property 'createTextNode' of undefined ...

  7. 【bat】通过for循环复制一张图片100次

    代码如下: @echo off set "F=1" cd C:\Users\Thinkpad\Desktop\img for /L %%F IN (1,1,100) DO COPY ...

  8. 14-spring学习-变量操作

    表达式所有操作都是可以以变量形式出现的. 观察变量的定义: package com.Spring.ELDemo; import org.springframework.expression.Evalu ...

  9. 文字选中的js实现

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 总结js(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

    http://hi.baidu.com/yashua839/blog/item/131fdb2fe547ef221f3089af.html一.Iframe 篇 //&&&&am ...