【CF840C】On the Bench DP

时间:2022-09-23 10:12:43

【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的更多相关文章

  1. 【BZOJ4712】洪水(动态dp)

    [BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...

  2. 【题解】Jury Compromise&lpar;链表&plus;DP&rpar;

    [题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...

  3. 【题解】Making The Grade&lpar;DP&plus;结论&rpar;

    [题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...

  4. 【题解】NOIP2017逛公园&lpar;DP&rpar;

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...

  5. 【题解】284E&period; Coin Troubles&lpar;dp&plus;图论建模&rpar;

    [题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...

  6. 【CF917D】Stranger Trees 树形DP&plus;Prufer序列

    [CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...

  7. 【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 ...

  8. 【BZOJ1210】&lbrack;HNOI2004&rsqb;邮递员 插头DP&plus;高精度

    [BZOJ1210][HNOI2004]邮递员 Description Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局.他所管辖的邮筒非常巧地排成了 ...

  9. 【BZOJ2331】&lbrack;SCOI2011&rsqb;地板 插头DP

    [BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...

随机推荐

  1. 初识google多语言通信框架gRPC系列(二)编译gRPC

    目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...

  2. tar 压缩和解压缩使用笔记

    tar 压缩和解压缩使用笔记 1 文件 1.1 打包 1.1 压缩 $ tar czf myfile.txt.tar.gz ./myfile.txt 1.2 解压缩 解压缩到目录: $ mkdir o ...

  3. &lbrack;BJOI2019&rsqb;排兵布阵——分组背包

    题目链接: [BJOI2019]排兵布阵 对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个. 那么对于第$i$座城堡,可以看做有$s+1$个物品(可以 ...

  4. Android系统中是否开启定位及定位模式的判断

    1.关于Android系统中不同的定位模式 Android系统中包括3中定位模式:   使用GPS.WLAN和移动网络 使用WLAN和移动网络 仅使用GPS 截图 特点 同时使用GPS.WIFI及基站 ...

  5. shell编程基础&lpar;三&rpar;&colon; 位置参数与shell脚本的输入输出

    一.位置参数和特殊变量 有很多特殊变量是被Shell自动赋值的,我们已经遇到了$?和$1,现在总结一下: 常用的位置参数和特殊变量: $0 相当于C语言main函数的argv[0] $1.$2... ...

  6. 在ASP&period;NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

  7. php跨域

    <?php header('Content-type:text/html; charset="utf-8"'); $url = 'http://10.32.41.194:80 ...

  8. L2tp协议简单解析

    1.L2TP简介 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议的一种 ...

  9. linux Nginx 日志脚本

    这篇文章主要介绍了nginx日志切割脚本.nginx日志分析脚本等,需要的朋友可以参考下. 参考自:http://www.jbxue.com/article/13927.html 任务计划 cront ...

  10. 用Apache James 3&period;3&period;0 搭建个人邮箱服务器

    准备域名 比如域名为example.net,则邮箱格式为test@example.net.在自己的域名管理界面,添加一条A记录(mail.example.net  xxx.xxx.xxx.xxx),指 ...