【CF840C】On the Bench DP
【CF840C】On the Bench
题意:给你一个长度为n的数组{ai},定义一个1到n的排列是合法的,当且仅当对于$1\le i <n$,$a_i\times a_{i+1}$不是完全平方数。求所有合法的排列个数。
$n\le 300,a_i\le 10^9$
题解:显然我们先把ai中的平方因子除掉,然后就变成了任意相邻两数不能相同的排列数。显然要将相同的数放到一起处理。
考虑DP,令f[i][j][k]表示枚举到第i个数,一共有j个相邻的位置是相同的,在之前所有和ai相同的数中,有k个相邻的位置 的方案数。转移复杂度$O(n^3)$。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int n;
int v[310];
ll f[2][310][310];
inline void upd(ll &x,const ll &y) {x+=y; if(x>=P) x%=P;}
int main()
{
scanf("%d",&n);
int i,j,k,d=0,tmp=0,t;
for(i=1;i<=n;i++)
{
scanf("%d",&t),v[i]=1;
for(j=2;j*j<=t;j++) if(t%j==0)
{
tmp=0;
while(t%j==0) tmp^=1,t/=j;
if(tmp) v[i]*=j;
}
if(t>1) v[i]*=t;
}
sort(v+1,v+n+1);
f[0][0][0]=1;
for(i=1;i<=n;i++)
{
if(v[i]>v[i-1])
{
for(j=0;j<=i;j++) for(k=1;k<=tmp;k++) upd(f[d][j][0],f[d][j][k]),f[d][j][k]=0;
tmp=0;
}
d^=1,memset(f[d],0,sizeof(f[d]));
for(j=0;j<=i;j++) for(k=0;k<=tmp&&k<=j;k++)
{
upd(f[d][j+1][k+1],f[d^1][j][k]*(2*tmp-k));
if(j) upd(f[d][j-1][k],f[d^1][j][k]*(j-k));
upd(f[d][j][k],f[d^1][j][k]*(i-(2*tmp-k)-(j-k)));
}
tmp++;
}
printf("%lld",f[d][0][0]);
return 0;
}
【CF840C】On the Bench DP的更多相关文章
- 【BZOJ4712】洪水(动态dp)
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...
- 【题解】Jury Compromise(链表+DP)
[题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...
- 【题解】Making The Grade(DP+结论)
[题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- 【题解】284E. Coin Troubles(dp+图论建模)
[题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...
- 【CF917D】Stranger Trees 树形DP+Prufer序列
[CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...
- 【CF889E】Mod Mod Mod DP
[CF889E]Mod Mod Mod 题意:给你一个序列$a_1,a_2...a_n$,定义$f(x,n)=x\mod a_n$,$f(x,i)=x\mod a_i+f(x \mod a_i,i+1 ...
- 【BZOJ1210】[HNOI2004]邮递员 插头DP+高精度
[BZOJ1210][HNOI2004]邮递员 Description Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局.他所管辖的邮筒非常巧地排成了 ...
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
随机推荐
- UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念
lienhua342014-10-05 1 main 函数是如何被调用的? 在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址.当内核执行 C ...
- 查看cp进度,使用watch
watch -n 1 -d du -sh dir 每隔1s查看当前目录所占空间大小
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
- Spring Boot项目使用Eclipse进行断点调试Debug
1.在命令行下定位到项目根目录,启动Spring Boot项目,命令如下: java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=80 ...
- python中的List 和 Tuple
#-*- coding:UTF-8 -*- classmates=["Michael","Bob","Tracy"] print(class ...
- Cakephp中使用JavaScriptHelper来引入js文件
页面的head部分的内容在Cakephp中主要是有htmlhelper来进行控制的,而js部分则是由JavaScripthelper来进行控制的,在controller里面设置好:var $helpe ...
- Phpcms V9手机门户设置教程:怎么用PC V9做手机网站
一.在PHPcms V9管理后台设置手机门户 1.1.开启手机网站.位置:模块 >手机门户 > 添加手机站点,具体设置可参照截图: 填写站点名和LOGO文件相对位置,绑定用于手机网站的二级 ...
- mysql 用户权限操作
https://www.cnblogs.com/SQL888/p/5748824.html http://blog.csdn.net/fafa211/article/details/2249217
- Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作
- 01-虚拟软件vmware安装
什么是虚拟软件: 虚拟原件是一个可以使你在一台机器上同时运行二个或更多Windows.LINUX等系统.它可以模拟一个标准PC环境.这个环境和真实的计算机一样,都有芯片组.CPU.内存.显卡.声卡.网 ...