思路来自FXXL中的某个链接

/*
CodeForces 840C - On the Bench [ DP ]  |  Codeforces Round #429 (Div. 1)
题意:给出一个数组,问有多少种下标排列,使得任意两个相邻元素的乘积不是完全平方数
分析:将数组分组,使得每组中的任意两个数之积为完全平方数由唯一分解定理可知,每个质因子的幂次的奇偶性相同的两个数之积为完全平方数即按每个质因子的幂次的奇偶性分组,故这样的分组唯一然后问题归结于每组中的数不能相邻的排列有几种设 dp[i][j]表示 前i组相邻的同组的数有j对考虑把第i+1组分段后插入前i组的空隙中枚举将下一组分成k段,每段相邻枚举k段中有l段插在前面j对同组的空隙中设前i组总个数为sum, 第i+1组个数为num则得到转移方程dp[i+1][j-l+num-k] += C(num-1, k-1) * C(j, l) * C(sum+1-j, k-l) * dp[i][j]组合数什么的仔细推导下,再最后乘上每组的排列数
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MOD = 1e9+7;
const int N = 305;
LL C[N][N], F[N];
void init() {C[0][0] = 1;for (int i = 1; i < N; i++) {C[i][0] = C[i][i] = 1;for (int j = 1; j < i; j++)C[i][j] = (C[i-1][j] + C[i-1][j-1]) % MOD;}F[0] = 1;for (int i = 1; i < N; i++) F[i] = i * F[i-1] % MOD;
}
bool check(LL a, LL b)
{LL l = 1, r = 1e10, mid;while (l <= r){mid = (l+r) >> 1;if (mid*mid <= a*b) l = mid+1;else r = mid-1;}return r*r == a*b;
}
LL dp[N][N], ans;
int n, a[N], id[N], num[N], cnt;
void solve()
{dp[0][0] = 1;int sum = 0;for (int i = 1; i <= cnt; i++)//第i组{for (int j = 0; j <= sum; j++)//j处平方for (int k = 1; k <= num[i]; k++)//num[i]分成k段for (int l = 0; l <= j && l <= k; l++)//j 中 l 段{LL tmp = dp[i-1][j];tmp = tmp * C[num[i]-1][k-1] % MOD;tmp = tmp * C[j][l] % MOD;tmp = tmp * C[sum+1-j][k-l] % MOD;dp[i][j-l+num[i]-k] += tmp;dp[i][j-l+num[i]-k] %= MOD;}sum += num[i];}ans = dp[cnt][0];for (int i = 1; i <= cnt; i++) ans = ans * F[num[i]] % MOD;
}
int main()
{init();cnt = 0;scanf("%d", &n);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);bool flag = 0;for (int j = 1; j < i; j++){if (check(a[i], a[j])){num[id[j]]++;id[i] = id[j];flag = 1; break;}}if (!flag){id[i] = ++cnt;num[cnt] = 1;}}solve();printf("%lld\n", ans);
}

  

转载于:https://www.cnblogs.com/nicetomeetu/p/7419307.html

CodeForces 840C - On the Bench | Codeforces Round #429 (Div. 1)相关推荐

  1. Codeforces Round #429 (Div. 2) B. Godsend

    Problem - B - Codeforces 题意: 给定一个数列,先手可以remove一段区间和为奇数的区间,后手可以remove一段区间和为偶数的区间,问你赢家是谁? 思路: 博弈题按状态的思 ...

  2. 2463: [中山市选2009]谁能赢呢? Codeforces Round #429 (Div. 2) B. Godsend noip三国游戏...

    Description 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子 ...

  3. Codeforces Round #429 Div. 1

    A:甚至连题面都不用仔细看,看一下样例就知道是要把大的和小的配对了. #include<iostream> #include<cstdio> #include<cmath ...

  4. Codeforces Round #429 (Div. 2):B. Godsend

    题目: Leha somehow found an array consisting of n integers. Looking at it, he came up with a task. Two ...

  5. Codeforces B. Dubious Cyrpto (枚举 / 模拟) (Round #657 Div.2)

    传送门 题意: 已知存在三个数a,b,c满足l <= a,b,c <= r,且m = n * a + b - c.现在告诉你l,r和m的值,需要你找到一组可行的a,b,c. 思路: 枚举a ...

  6. Codeforces Round #245 (Div. 1) E. Points and Segments 欧拉回路 + 建模

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑对于线段,如何建模. 我们考虑先将线段转换成左闭右开的形式,将左右点连起来. 再考虑每个点,将所有离散化后的点拿出来,每个点都有一个度,现在问题就 ...

  7. Codeforces Round #456 (Div. 2)

    Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...

  8. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  9. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

最新文章

  1. C#基础系列问题一break、continue、return、goto语句
  2. 考博024001计算机科学与技术综合知识,2005-2006年同等学力人员申请硕士学位学科综合水平全国统一考试计算机科学与技术试卷.pdf...
  3. 从零单排学Redis【青铜】
  4. 成功解决ModuleNotFoundError: No module named ‘minepy.mine‘
  5. Mybatis更新和删除数据
  6. Python网络编程—TCP套接字之HTTP传输
  7. JAVA异常处理分析(中)
  8. 【渝粤题库】陕西师范大学200371 拓扑学 作业 (专升本、高起本)
  9. 中国刹车片自动检测系统行业市场供需与战略研究报告
  10. java 数组中数字和_java – 查找数组中的数字总和 – 不包括数字13和它后面的数字...
  11. 前端 vue 加载TIFF图片
  12. 5python 体脂率计算(优化版)
  13. python基础练习题:重新排序【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  14. My Java 总结
  15. 王者荣耀s10服务器维护,王者荣耀s9维护到几点?王者荣耀s10赛季上线时间分享...
  16. php 网状结构,数据库模型-数据结构-网状模型
  17. 大象---thinking in UML
  18. 计算机房的网络化管理,学校计算机房的设计与管理
  19. 计算机连校园网没有弹出页面,我的电脑连接校园网 能连上,但是浏览器不弹出来 登录页面,为何...
  20. InfiniBand 网络

热门文章

  1. android日期选择区间控件_Android日期时间选择器实现以及自定义大小
  2. mysql建立外键案例_MySQL外键实例
  3. 微信小程序四种父子相互传值方式
  4. Python的find、rfind、index、rindex方法的区别
  5. 20201124:力扣第216场周赛(上)
  6. KM、流程、风险管理的关系分析
  7. VB 子类化技术详解
  8. Linux shell内核使用
  9. 引用网易等相册的图片出现防盗链怎么办呢?看这里就迎刃而解!(转贴)
  10. 知道吗?BAT去年在KDD上作为第一单位发表了12篇文章!(内附每篇文章解读)...