题意:给你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. java语言在某个数组中查找某个字符出现的次数

    package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Test { /* * 在某 ...

  2. Linux学习(三)putty,xshell使用以及密匙登陆

    一.认识xshell,putty 他们都是服务器登陆客户端.xshell用户体验更好一点.但这里都学一下. putty下载地址:https://www.chiark.greenend.org.uk/~ ...

  3. strict 严格模式

    严格模式可以让你更早的发现错误,因为那些容易让程序出错的地方会被找出来   打开严格模式:"use strict" 不支持的javascript引擎会忽略它,当作是一个未赋值字符串 ...

  4. Ajax comet XMLHttpRequest 异步

    function createXHR() { if (typeof XMLHttpRequest != “undefi ned”){      return new XMLHttpRequest(); ...

  5. jQuery选择器(可见性选择器)第五节

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. ASP.NET Core 应用程序Startup类介绍

    Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...

  7. 《天书夜读:从汇编语言到windows内核编程》二 C语言的流程与处理

    1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下fo ...

  8. 如何在ASP.NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

  9. 使用dropwizard(5)--加入swagger

    前言 Swagger已经成API service的规范了,本处在dropwizard中简单集成Swagger. Demo source https://github.com/Ryan-Miao/l4d ...

  10. 【JDK1.8】JDK1.8集合源码阅读——TreeMap(一)

    一.前言 在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解. 二.TreeMap的继承关 ...