codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。
限制相邻元素,求合法序列数。
/**
题目: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+排列组合 限制相邻元素,求合法序列数。的更多相关文章
- Codeforces 840C. On the Bench 动态规划 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/CF840C.html 题解 首先,我们可以发现,如果把每一个数的平方因子都除掉,那么剩下的数,不相等的数都可以相 ...
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
- 【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是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- LightOJ1005 Rooks(DP/排列组合)
题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0 ...
- HDU 5816 状压DP&排列组合
---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
随机推荐
- 【转】TextView的详细属性
1.简介: TextView控件可用来展示文本信息(包括HTML文本),可以手动来设置可编辑或不可编辑. 2.创建对象: 1)在代码中通过new的方式创建,创建,设置文本,样式后,通过setConte ...
- iOS核心动画 - CALayer
大家知道,在iOS中所有的视图都继承自UIView. UIView处理所有的触摸事件和画图. 事实上,UIView所有的渲染和动画是托管给另一个类来负责的,它就是CALayer. 但是,需要记住的是, ...
- tomcat服务器开启gzip功能的方法
http://blog.csdn.net/wang_159369/article/details/8107163 tomcat5.0以后的版本是支持对输出内容进行gzip格式的压缩的.该功能默认是关闭 ...
- Unity for Windows: III–Publishing your unity game to Windows Phone Store
原地址:http://digitalerr0r.wordpress.com/2013/08/27/unity-for-windows-iiipublishing-to-windows-phone-st ...
- Unity for Windows: II – Publishing Unity games to Windows Store
原地址:http://digitalerr0r.wordpress.com/2013/08/27/unity-for-windows-ii-publishing-to-windows-8/ Windo ...
- android安装应用程序工具类
/** * 安装APK文件 *@param APK文件 *Version: *author:YangQuanqing */ private void installAPK(File file){ // ...
- windows bat启动多个应用程序
windows bat启动多个应用程序 CreationTime--2018年7月26日11点02分 Author:Marydon 1.应用场景 每天开机后,都需要打开平常所需要的软件,又不想将程 ...
- webservice调用的四种方式
因为数据在网络上传输都是通过xml形式的,本质都是把数据封装然后通过xml传输,接收到的也是xml文件,1 和 4 让程序员屏蔽了处理xml文件,而2 和3需要程序员自己写请求体 ,还要处理返回的xm ...
- Discuz管理员前台正常后台登录不进如何解决
Discuz管理员前台可以登录后台无法登录的解决方法步骤如下 1. 取消ip认证 config_global.php 中找到 $_config['admincp']['checkip'] = 0 2. ...
- 【翻译】Android多线程下安全访问数据库
为了记录如何线程安全地访问你的Android数据库实例,我写下了这篇小小札记.文章中引用的项目代码请点击这里 假设你已编写了自己的 SQLiteOpenHelper. publicclas ...