题意:给你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. git常用命令集合

    git命令 git init:创建一个仓库并在目录下新建一个.git的文件(初始化一个git仓库) 注:.git文件在工作区,是一个隐藏文件(用ls -ah命令查看),但是它不算工作区,而是git 的 ...

  2. 使用Identity Server 4建立Authorization Server (2)

    第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 ...

  3. visual studio 2013使用github获取代码

    如图点击"视图""团队资源管理器".   点击主页上方的那个插头形状按钮"连接到团队项目".点击"克隆"   然后在克隆 ...

  4. HTML资源定位器-URL

    URL 也被称为网址. URL 可以由单词组成,比如 "www.baidu.com",或者是因特网协议(IP)地址:192.168.1.253. URL - Uniform Res ...

  5. Celery 源码解析四: 定时任务的实现

    在系列中的第二篇我们已经看过了 Celery 中的执行引擎是如何执行任务的,并且在第三篇中也介绍了任务的对象,但是,目前我们看到的都是被动的任务执行,也就是说目前执行的任务都是第三方调用发送过来的.可 ...

  6. windows中更换Jdk版本不生效

    本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装jdk1.6前,执行java -version得到 C:\Users\liuxi ...

  7. Makefile持续学习二

    Makefile概述 一.Makefile里有什么? Makefile里主要包含5个东西:显式规则.隐晦规则.变量定义.文件指示和注释 1.显式规则:显式规则说明如恶化生成一个或多的目标文件,包含要生 ...

  8. Makefile例子引入

    Makefile规则 target ... :prerequisites... command target就是一个目标文件,可以是object file,也可以是可以执行文件,也可以是一个标签 pr ...

  9. 重启mysql主从同步mongodb(tungsten-replicator)

    1. 连接mysql mysql -uroot -p;(mysql从库) 输入数据库密码 2. 停止主同步 mysql> stop slave; 3. 清数据 将mongo库数据清空 4. 杀主 ...

  10. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...