题意:有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的更多相关文章

  1. HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8

    /* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...

  2. HDU 6143 Killer Names(容斥原理)

    http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意: 用m个字母去取名字,名字分为前后两部分,各由n个字符组成,前后两部分不能出现相同字符,问合法的组成 ...

  3. 2017多校第8场 HDU 6143 Killer Names 容斥,组合计数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:m种颜色需要为两段长度为n的格子染色,且这两段之间不能出现相同的颜色,问总共有多少种情况. ...

  4. HDU 6143 Killer Names

    Killer Names Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  5. HDU 6143 17多校8 Killer Names(组合数学)

    题目传送:Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human appre ...

  6. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  7. HDU 6143 Killer Names DP+快速密

    Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human apprentice ...

  8. hdu 6143第二类striling

    题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边可以选1,2....min(n,m-i)种字符 这样就把问题转化为用k种字符构造n长度的字符串的种 ...

  9. hdu 6143: Killer Names (2017 多校第八场 1011)

    题目链接 题意,有m种颜色,给2n个位置染色,使左边n个和右边n个没有共同的颜色. 可以先递推求出恰用i种颜色染n个位置的方案数,然后枚举两边的染色数就可以了,代码很简单. #include<b ...

随机推荐

  1. Postgresql使用coalesce实现类似oracle的NVL方法

    COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值. 如果所有的表达式都是空值,最终将 ...

  2. MATLAB中图像的基本操作

    MATLAB中图像的基本操作 1.读取.显示图片 MATLAB中提供了immread()与imshow()函数读取和显示图片.其中读取函数imread()原型: imread: A = imread( ...

  3. dom 加载监听事件 及解析

    document.addEventListener("DOMContentLoaded", function (_event) { console.log("初始DOM ...

  4. android: 使用android逆向助手反编译APK

    第一步:下载逆向助手:(链接: https://pan.baidu.com/s/15jtoFDg9LWV80HREeyx5HA 提取码: k527 ) 第二步:将apk文件拷贝到逆向助手的apktoo ...

  5. scope.row中属性值展示

    <el-table-column align="> <template slot-scope="scope"> {{ scope.$index } ...

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_06-方法授权-方法授权测试-无权限异常处理

    现在没权限返回的信息 控制台抛出的异常是这个 : 不允许访问,这是Spring Security跑出来的 我们在异常处理器里面打个断点看一下 重新测试,就跳转到了异常捕获类这里. 这是异常的类型 这里 ...

  7. java接口如何有效防止恶意请求

    java接口如何有效防止恶意请求?已解决   解决方法: 1.在redis数据库db0中新建一个名为rd_sms_request_count表,表结构: Ip:客户请求的ip Success_coun ...

  8. Qt编写自定义控件59-直方动态图

    一.前言 直方动态图类似于音乐播放时候的柱状图展示,顶部提供一个横线条,当柱状上升的时候,该线条类似于帽子的形式冲到顶端,相当于柱状顶上去的感觉,给人一种动态的感觉,听音乐的同时更加赏心悦目,原理比较 ...

  9. Ubuntu 16.04 haproxy + keeplive

    WEB架构

  10. LeetCode_28. Implement strStr()

    28. Implement strStr() Easy Implement strStr(). Return the index of the first occurrence of needle i ...