Codeforces 830C On the Bench
题意:给你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的更多相关文章
- CodeForces 840C - On the Bench | Codeforces Round #429 (Div. 1)
思路来自FXXL中的某个链接 /* CodeForces 840C - On the Bench [ DP ] | Codeforces Round #429 (Div. 1) 题意: 给出一个数组, ...
- codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。
限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...
- Codeforces 840C On the Bench dp
On the Bench 两个数如果所有质因子的奇偶性相同则是同一个数,问题就变成了给你n个数, 相同数字不能相邻的方案数. dp[ i ][ j ]表示前 i 种数字已经处理完, 还有 j 个位置需 ...
- Codeforces 840C - On the Bench(dp/容斥原理)
Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2500 的 D1C,可个人认为难度堪比某些 *2700 *2800. 不过嘛,*2500 终究还是 *2500,还是被我自己 ...
- Codeforces 840C. On the Bench 动态规划 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/CF840C.html 题解 首先,我们可以发现,如果把每一个数的平方因子都除掉,那么剩下的数,不相等的数都可以相 ...
- Codeforces 830C Bamboo Partition 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/CF830C.html 题解 把问题转化成求最大的 $d$ ,满足$$\sum_{1\leq i \leq n}( ...
- Codeforces 830C Bamboo Partition (看题解)
Bamboo Partition 列公式, 整除分块, 想不到, 好菜啊. #include<bits/stdc++.h> #define LL long long #define fi ...
- 【CodeForces 830C】奇怪的降复杂度
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60638239 description 有n棵竹子 ...
- 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 解 只要不存在某个字母,它的 ...
随机推荐
- spark三种连接Join
本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...
- linux虚拟机局域网网卡配置
1:配置虚拟机 1-1:打开:虚拟机下编辑->虚拟网络编辑器 选择VMnet信息下的桥接模式,在“桥接到”下拉列表里选择自己的网卡. ...
- 2016-2017 ACM-ICPC, Asia Tsukuba Regional Contest D Hidden Anagrams
题目链接:http://codeforces.com/gym/101158/attachments /* * @Author: lyucheng * @Date: 2017-10-21 12:20:0 ...
- NumPy基础练习(练一遍搞定NumPy)
import numpy as np import pandas as pd from numpy import random from numpy.random import randn ##### ...
- Cisco VPN Client Win10无法使用的解决办法
http://files.cnblogs.com/files/Flyear/VPN_Win10_ByDuke.zip 1. 关闭系统所有窗口,控制面板一定要关闭. 2. 运行winfix.exe, 按 ...
- selenium切换窗口
在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢? 获取窗口的唯一标识用句柄(handle)表示,因此只需要切换句柄,就可以灵活的在各窗口之间切换. 下面介绍几个方法 c ...
- eclipse导出jar(含依赖)三步走
之前用eclipse导出jar运行结果一直不尽人意,排查问题排查很久,最终确定到导出jar时,如果依赖jdk以外的jar时,就要通知eclipse 看了很多帖子,感觉操作起来都比较麻烦,注意点也比较多 ...
- Velocity(5)——#macro 指令
1 #macro(formatIncreaseData $increase) 2 #if(${product.onlineStatusFlag} =='0') 3 -- 4 #elseif(!$inc ...
- C#执行PowserShell 脚本
Windows PowserShell能够很简洁 快速通过Script脚本方式获得我们想要执行效果. 如何在C#中任意执行PowerShell脚本.?类似目前我要在做一个进程管理工具. 通过Power ...
- Python之matplotlib学习(一)
小试牛刀 在上一节已经安装好matplotlib模块,下面使用几个例子熟悉一下. 对应的一些文档说明: http://matplotlib.org/1.3.1/api/pyplot_summary.h ...