hdu 6143
题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符
枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符
这样就把问题转化为用k种字符构造n长度的字符串的种类有多少种
容斥:单独考虑每一位上的字符都有k种选择,k^n,但会有不够k种的情况,所以要减去只有k-1种颜色,只有k-2种颜色。。。。的情况
这里是用容斥处理一下
好,上面都是copy过来的东西,现在是自己写的了。。 首先,这道题目比赛的时候没写出来,虽然当时想到了用容斥处理,但是对容斥的情况没有理解清楚。
复习一下容斥,写容斥的时候,我们先要理出最小集合,这些集合的并能够得到我们想到的结果;在在就是集合的交有了一个新的认识,以前的理解太肤浅了。
对于这道题目,我们定理f(x)为x个字母全部用上的方案数,利用容斥,一般要考虑逆问题。f(x)的逆问题———k个元素中,至少有一个字母没用上的方案数。
那么最小集合为有一个字母没用上,其他字母可用可不用的情况,之后的容斥就可以了。
附上一个骚气的代码(自己写的老是超时,有点烦,贴了个其他大佬的):
#include <cstdio>
#include <iostream>
typedef long long LL;
using namespace std;
const int maxn =;
const int mod = 1e9+; LL res[maxn];
LL C[maxn][maxn];
LL mul[maxn][maxn]; LL mult(LL a,LL b)
{
if(mul[a][b])return mul[a][b]; // 这个记录的方式也是。。。 长见识了
LL ans=,aa=a,bb=b;
a%=mod;
while(b)
{
if(b&)ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=;
}
mul[aa][bb]=ans;
return ans;
} void init()
{
C[][]=;
for(int i=; i<maxn; i++)
for(int j=; j<=i; j++)
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
} LL getget(LL n,LL m)
{
LL cnt=;
for(int k=; k<=m; k++)
{
if(k&)cnt=(cnt-C[m][k]*mult(m-k,n)%mod)%mod;
else cnt=(cnt+C[m][k]*mult(m-k,n)%mod+mod)%mod;
}
return cnt;
} template <class T>
inline void scan_d(T &ret)
{
char c;
ret = ;
while ((c = getchar()) < '' || c > '');
while (c >= '' && c <= '')
ret = ret * + (c - ''), c = getchar();
} void Out(LL a)
{
if (a < )
{
putchar('-');
a = -a;
}
if (a >= )
Out(a / );
putchar(a % + '');
} int main()
{
init();
int T;
scan_d(T);
while(T--)
{
memset(res,,sizeof(res));
int n,m;
LL ans=;
scan_d(n);
scan_d(m);
for(int i=; i<m; i++)
res[i]=getget(n,i);
for(int i=; i<m; i++)
for(int j=i; j<=m-i; j++)// 这里枚举两个数的时候,采用有序枚举的形式,降低一点复杂度,还可以去重。
{
LL aa=C[m][i]*res[i]%mod;
LL bb=C[m-i][j]*res[j]%mod;
LL cnt = (aa*bb)%mod;
if(i!=j) cnt = (cnt+cnt)%mod;
ans=(cnt+ans)%mod;
}
Out(ans);
putchar('\n');
}
return ;
}
hdu 6143的更多相关文章
- HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8
/* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...
- HDU 6143 Killer Names(容斥原理)
http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意: 用m个字母去取名字,名字分为前后两部分,各由n个字符组成,前后两部分不能出现相同字符,问合法的组成 ...
- 2017多校第8场 HDU 6143 Killer Names 容斥,组合计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:m种颜色需要为两段长度为n的格子染色,且这两段之间不能出现相同的颜色,问总共有多少种情况. ...
- HDU 6143 Killer Names
Killer Names Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- HDU 6143 17多校8 Killer Names(组合数学)
题目传送:Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human appre ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- HDU 6143 Killer Names DP+快速密
Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human apprentice ...
- hdu 6143第二类striling
题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...
- hdu 6143: Killer Names (2017 多校第八场 1011)
题目链接 题意,有m种颜色,给2n个位置染色,使左边n个和右边n个没有共同的颜色. 可以先递推求出恰用i种颜色染n个位置的方案数,然后枚举两边的染色数就可以了,代码很简单. #include<b ...
随机推荐
- arcgis python 刷新
arcpy.RefreshActiveView() 刷新地图和布局窗口 arcpy.RefreshTOC() 刷新内容列表 arcpy.RefreshCatalog(r"F:\tknew10 ...
- Cross-Site Request Forgery (CSRF)
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) Overview Cross-Site Request Forger ...
- 基于python的人脸识别(检测人脸、眼睛、嘴巴、鼻子......)
本文链接:https://blog.csdn.net/James_Ray_Murphy/article/details/79209172 import numpy as np import cv2 # ...
- 解决Visual Studio:"无法导入以下密钥文件: xxxx.pfx,该密钥文件可能受密码保护"
[解决方法] 从开始菜单找到并打开Visual Studio 命令提示(2010):开始->Microsoft Visual Studio 2010->Visual Studio Tool ...
- vue设置公共常量
Global.vue <template> </template> <script type="text/javascript"> const ...
- Ionic4.x 中自定义公共模块
1.创建公共模块以及组件 ionic g module module/slide ionic g component module/slide 2.公共模块 slide.module.ts 中暴露对应 ...
- Facebook libra开发者文档- 1 -welcome
参考https://developers.libra.org/docs/welcome-to-libra 欢迎来到Libra开发者网站!Libra的使命是建立一个简单的全球货币和金融基础设施,为数十亿 ...
- Flask 应用如何部署
1. Why Flask+Gunicorn+Nginx Flask+Gunicorn+Nginx是最常用的Flask部署方案,大家深究过为何用这样的搭配么? 1.1 Why? Flask 是一个web ...
- InfluxDB权限认证机制
一.介绍 权限认证机制,顾名思义,就是对 InfluxDB 数据库添加权限访问控制,在默认情况下,InfluxDB 的权限认证机制是关闭的,也就是说所有用户都有所有权限. 老规矩,直接实践上手,下图是 ...
- .Net Core 定时器Quartz
最近因为项目需要用到了Quartz,下面简单记录一下. 一.首先需要安装Quartz. 二.定义一个执行的Job类,实现IJob接口,接口有一个方法Execute,用来执行定时任务的实现内容. pub ...