题目大意:

对n个排成一排的物品涂色,有m种颜色可选。

要求相邻的物品颜色不相同,且总共恰好有K种颜色,问所有可行的方案数

分析:

从m种颜色中选出k种,有c(m,k)种方法,那么我们只用考虑 k种颜色的涂法即可

显然第一个物品有k种涂法,后面的因为不能跟前面的相同都只有k-1种涂法

因此容易想到一个公式:k*(k-1)^(n-1)

但是这个公式算的是 不超过k种颜色的涂法,题目要求必须k种,怎么办呢?

先考虑一个简化版的问题:

用而且用完5种颜色涂不相关的五个物品的方案数

用阶乘的方法可以算出 ans=120,换一种思路呢想一想这个问题,容易想到

ans(取五种颜色)=5^5(取不大于5种颜色)-c(5,4)*4^5(取不大于4种颜色)

可是一算发现ans竟然小于0了,这是怎么回事呢?容易发现其实取小于四种颜色的方案被减重复了

于是想到需要容斥

ans=c(5,5)*5^5-c(5,4)*4^5+c(5,3)*3^5-c(5,2)*2^5+c(5,1)*1^5 =120

这个问题解决了。原问题也就差不多了。。

代码:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<string>
  6. #include<ctype.h>
  7. using namespace std;
  8. const long long mod=;
  9. const long long ny=;
  10. long long n,m,k;
  11. long long cm[];
  12. long long cn[];
  13. long long ck[];
  14. long long inv[];
  15. long long mo(long long x)
  16. {
  17. while(x<)
  18. x+=mod;
  19. return x%mod;
  20. }
  21. long long exgcd(long long a,long long b,long long &x,long long &y)
  22. {
  23. if(a==&&b==) return -;
  24. if(b==){x=;y=;return a;}
  25. long long d=exgcd(b,a%b,y,x);
  26. y-=a/b*x;
  27. return d;
  28. }
  29. long long Inv(long long a,long long n)
  30. {
  31. long long x,y;
  32. long long d=exgcd(a,n,x,y);
  33. if(d==) return (x%n+n)%n;
  34. else return -;
  35. }
  36. long long quickmod(long long a,long long b,long long m) //a^b%m
  37. {
  38. long long res=;
  39. while(b)
  40. {
  41. if(b&)
  42. res=res*a%mod;
  43. b>>=;
  44. a=a*a%mod;
  45. }
  46. return res;
  47. }
  48. void ini()
  49. {
  50. cn[]=cm[]=;
  51. memset(cm,,sizeof(cm));
  52. cm[]=;
  53. int tmp=min(m/,k);
  54. for(int i=;i<=tmp;i++)
  55. {
  56. cm[i]=(cm[i-]*(m+-i)%mod*inv[i])%mod;
  57. }
  58. if(cm[k]==)
  59. cm[k]=cm[m-k];
  60. ck[]=ck[k]=;
  61. for(int i=;i<=k/;i++)
  62. {
  63. ck[i]=(ck[i-]*(k+-i)%mod*inv[i])%mod;
  64. ck[k-i]=ck[i];
  65. }
  66. }
  67. int main()
  68. {
  69. //freopen("in.txt","r",stdin);
  70. //freopen("out.txt","w",stdout);
  71. inv[]=;
  72. for(int i=;i<=;i++)
  73. {
  74. inv[i]=Inv(i,mod);
  75. }
  76. int t;
  77. scanf("%d",&t);
  78. int cas=;
  79. while(t--)
  80. {
  81. cas++;
  82. scanf("%I64d%I64d %I64d",&n,&m,&k);
  83. ini();
  84. long long ans=;
  85. long long p=;
  86. for(int i=k;i>=;i--)
  87. {
  88. ans=(ans+p*((ck[k-i])*i%mod*quickmod(i-,n-,mod)%mod)+mod)%mod;
  89. p=-p;
  90. }
  91. ans=(ans*cm[k])%mod;
  92. printf("Case #%d:%c%I64d\n",cas,' ',ans);
  93. }
  94. return ;
  95. }

codeforces 100548F (西安现场赛F题):容斥原理的更多相关文章

  1. CF GYM100548 (相邻格子颜色不同的方案数 2014西安现场赛F题 容斥原理)

    n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m ...

  2. 2014西安现场赛F题 UVALA 7040

    地址 题意:求在m种颜色中挑选k种颜色,给n个花朵涂色有几种方法. 分析:画图可以发现,基本的公式就是k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总颜色数不超过k种,并没有保证恰好出现k种 ...

  3. 华中邀请赛现场赛F题 Seats

    题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1552 解题报告:题目意思应该很清楚,就是有n个人,分别属于7个班级,然后他们坐成 ...

  4. 19秦皇岛现场赛F题 dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6736 如果环的边长为k,那么环的删边方案数是2k-1.如果链的边长为k,那么链的删边方案数是2k.环的 ...

  5. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  6. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  7. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  8. Gym101981D - 2018ACM-ICPC南京现场赛D题 Country Meow

    2018ACM-ICPC南京现场赛D题-Country Meow Problem D. Country Meow Input file: standard input Output file: sta ...

  9. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题

    第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...

随机推荐

  1. PHP5.4新特性(转)

    PHP5.4正式前两天发布了,之前有看了一些PHP5.4主要特性相关文章,因此在这里小结一下. 其中好几点更新是由Laruence贡献的!本文部分内容也是源自Laruence的博客. 1. Buid- ...

  2. Java基础知识强化26:Object类之hashCode()方法、getClass()方法

    1. Object类的hashCode()方法,如下: public  int  hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...

  3. 怎么在Linux上下载并安装ESET NOD32 Antivirus 4桌面版

    转自:怎么在Linux上下载并安装ESET NOD32 Antivirus 4桌面版 下载并安装ESET NOD32 Antivirus 4的Linux桌面版,根据下面的步骤一步一步的来: I.  下 ...

  4. HTTP调试 抓包 工具 Fiddle 简介 示例

    简介 1.常用抓包工具对比: Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要"无刷新修改",如果 ...

  5. hdu 2211

    题意: 中文题目,自己看.............. 递归调用.... 没什么难度,注意下long long就行........ AC代码: #include <iostream> #de ...

  6. toString结果

    String[] str = new String[] { "a", "b", "c" }; System.out.println(str) ...

  7. state模式理解

    state模式应用场景 条件判断很多的情况 比如有很多if else语句:switch case语句等等. 如果以后业务越来越复杂,条件判断有100多个,每种条件的处理逻辑很复杂,不止一个业务逻辑会重 ...

  8. js动态新增组合Input标签

    var x = 1; function addlink() { var linkdiv = document.getElementById("add1_0"); if (linkd ...

  9. IIS7.5 提示未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序

    在WIN7 X64平台IIS7.5,使用Asp.net连接access数据库时候,提示:未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序. 说明: 执行当前 Web 请求 ...

  10. CSS3 用户界面

    CSS3用户界面 在CSS3中,新的用户界面特性包括重设元素尺寸,盒尺寸以及轮廓等. 用户界面属性: resize box-sizing outline-offset 浏览器支持 属性 浏览器支持 r ...