题意:给你n个数,问有多少种排列方式使得任意两个相邻的数的乘积都不是完全平方数

我好弱,被组合和数论吊着打。。。

首先我们可以把每个数中固有的完全平方数给分离出来,那么答案其实就只与处理后的序列相关。

考虑把相同的数分为一类,设dp[i][k]表示前i组数分为k类的方案数,于是用隔板法搞搞就有:

$dp[i][j]=\sum_{k=1}^{j}{dp[i][j-k]}C^{k-1}_{n_{i}-1}*\frac{n_{i}!}{k!}$

根据容斥原理,最终的答案就是:

$ans=dp[n]n!−dp[n−1]!(n-1)!+⋯+(−1)^{(n−i)}dp[i]i!$

之后注意一下阶乘的求逆即可

#include<bits/stdc++.h>
using namespace std;
#define MAXN 300+10
#define MODD 1000000007
#define fi first
#define se second
typedef long long LL;
int n;
LL jie[MAXN],c[MAXN][MAXN],dp[MAXN][MAXN];
map<LL,int>cnt;
LL pw(LL a,LL b){
a%=MODD;
LL ans=;
for(;b;b>>=,a=a*a%MODD)
if(b&)ans*=a,ans%=MODD;
return ans;
}
void init(){
c[][]=jie[]=;
for(int i=;i<=;i++){
c[i][]=;
for(int j=;j<=;j++)
c[i][j]=(c[i-][j]+c[i-][j-])%MODD;
}
for(int i=;i<=;i++)jie[i]=jie[i-]*i%MODD;
}
int main(){
init();
scanf("%d",&n);
for(int i=;i<=n;i++){
LL x;
scanf("%I64d",&x);
for(int j=;j*j<=x;j++)
while(x%(j*j)==)x/=(j*j);
cnt[x]++;
}
dp[][]=;
map<LL,int>::iterator it;
int tot=;
for(it=cnt.begin();it!=cnt.end();it++){
for(int i=;i<=n;i++){
int m=min(it->se,i);
for(int j=;j<=m;j++){
LL tmp=jie[it->se];
tmp*=c[(it->se)-][j-];tmp%=MODD;
tmp*=pw(jie[j],MODD-);tmp%=MODD;
dp[tot][i]+=dp[tot-][i-j]*tmp;
dp[tot][i]%=MODD;
}
}
tot++;
}
tot--;
LL ans=dp[tot][n]*jie[n]%MODD;
int flag=;
for(int i=n-;i>=;i--){
if(flag&)ans=(ans+dp[tot][i]*jie[i])%MODD;
else ans=(ans-dp[tot][i]*jie[i]+MODD)%MODD;
ans=(ans+MODD)%MODD;
flag^=;
}
printf("%I64d\n",ans);
return ;
}

Codeforces 830C On the Bench的更多相关文章

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

    思路来自FXXL中的某个链接 /* CodeForces 840C - On the Bench [ DP ] | Codeforces Round #429 (Div. 1) 题意: 给出一个数组, ...

  2. codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。

    限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...

  3. Codeforces 840C On the Bench dp

    On the Bench 两个数如果所有质因子的奇偶性相同则是同一个数,问题就变成了给你n个数, 相同数字不能相邻的方案数. dp[ i ][ j ]表示前 i 种数字已经处理完, 还有 j 个位置需 ...

  4. Codeforces 840C - On the Bench(dp/容斥原理)

    Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2500 的 D1C,可个人认为难度堪比某些 *2700 *2800. 不过嘛,*2500 终究还是 *2500,还是被我自己 ...

  5. Codeforces 840C. On the Bench 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF840C.html 题解 首先,我们可以发现,如果把每一个数的平方因子都除掉,那么剩下的数,不相等的数都可以相 ...

  6. Codeforces 830C Bamboo Partition 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF830C.html 题解 把问题转化成求最大的 $d$ ,满足$$\sum_{1\leq i \leq n}( ...

  7. Codeforces 830C Bamboo Partition (看题解)

    Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...

  8. 【CodeForces 830C】奇怪的降复杂度

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60638239 description 有n棵竹子 ...

  9. Codeforces Round #429 (Div. 2/Div. 1) [ A/_. Generous Kefa ] [ B/_. Godsend ] [ C/A. Leha and Function ] [ D/B. Leha and another game about graph ] [ E/C. On the Bench ] [ _/D. Destiny ]

    PROBLEM A/_ - Generous Kefa 题 OvO http://codeforces.com/contest/841/problem/A cf 841a 解 只要不存在某个字母,它的 ...

随机推荐

  1. 《Spark Python API 官方文档中文版》 之 pyspark.sql (二)

    摘要:在Spark开发中,由于需要用Python实现,发现API与Scala的略有不同,而Python API的中文资料相对很少.每次去查英文版API的说明相对比较慢,还是中文版比较容易get到所需, ...

  2. Leetcode题解(33)

    113. Path Sum II 题目 分析: 主要考察二叉树深度优先遍历(DFS),递归调用当前节点的左右结点即可,代码如下(copy网上): /** * Definition for binary ...

  3. Problem Q

    Problem Description A factory produces products packed in square packets of the same height h and of ...

  4. AngularJS学习篇(九)

    AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. $http.get('someUrl',config).then(s ...

  5. h5 动画页面

    伪元素上就不要做动画了,页面果然应该做一个测试一个啊   拿到设计稿一开始就先看看这个设计稿的布局,有一些是从页面顶部到底部都有效果的,这个时候就要考虑在 iPhone4 这样屏幕不够高的设备上如何保 ...

  6. HTML学习笔记 CSS文本及字体及连接及列表(a标签使用及缩进) 案例 第七节 (原创)参考使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Lombok 使用小结

    Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lo ...

  8. kafka学习笔记2:生产者

    这次的笔记主要记录一下kafka的生产者的使用和一些重要的参数. 文中主要截图均来自kafka权威指南 主要涉及到两个类KafkaProducer和ProducerRecord. 总览 生产者的主要架 ...

  9. Array类的Sort()方法

    刚复习了Array类的sort()方法, 这里列举几个常用的,和大家一起分享. Array类实现了数组中元素的冒泡排序.Sort()方法要求数组中的元素实现IComparable接口.如System. ...

  10. API设计相关

    来自HeroKu的HTTP API 设计指南 http://get.jobdeer.com/343.get https://github.com/interagent/http-api-design ...