一个包含四个点的完全图,可以在任意节点出发,可以在任意节点结束,给出每个点被经过的次数,求有多少种合法的遍历序列。如果两个序列至少有一位是不同的,则认为它们不相同。

Input

  1. 2 3 3 3

Sample Output

  1. 12336

题意:给a个A,b个B,c个C,d个D,求有少种排列,使得相邻的两个不同。

思路:用容斥来做,ans=所有排列-至少一个相邻+至少两个相邻-...+...。

假设有i堆a,则方案数位C(a-1,i-1),则a中至少a-i个相邻;同理; 则i堆a,j堆b,k堆c,l堆d,至少有N-i-j-k-l个相邻,其对应的排列数为 N!/(i!*j!*k!*l!);

  1. #include<bits/stdc++.h>
  2. #define rep(i,x,y) for(int i=x;i<=y;i++)
  3. using namespace std;
  4. #define MOD Mod
  5. #define ll long long
  6. const int G=;
  7. const int Mod=;
  8. const int maxn=;
  9. int qpow(int v,int p)
  10. {
  11. int ans=;
  12. for(;p;p>>=,v=1ll*v*v%Mod)
  13. if(p&)ans=1ll*ans*v%Mod;
  14. return ans;
  15. }
  16. void rader(int y[], int len) {
  17. for(int i=,j=len/;i<len-;i++) {
  18. if(i<j) swap(y[i],y[j]);
  19. int k=len/;
  20. while(j>=k) j-=k,k/=;
  21. if(j<k) j+=k;
  22. }
  23. }
  24. void NTT(int y[],int len,int opt) {
  25. rader(y,len);
  26. for(int h=;h<=len;h<<=) {
  27. int wn=qpow(G,(MOD-)/h);
  28. if(opt==-) wn=qpow(wn,Mod-);
  29. for(int j=;j<len;j+=h) {
  30. int w=;
  31. for(int k=j;k<j+h/;k++) {
  32. int u=y[k];
  33. int t=(ll)w*y[k+h/]%MOD;
  34. y[k]=(u+t)%MOD;
  35. y[k+h/]=(u-t+MOD)%MOD;
  36. w=(ll)w*wn%MOD;
  37. }
  38. }
  39. }
  40. if(opt==-) {
  41. int t=qpow(len,MOD-);
  42. for(int i=;i<len;i++) y[i]=(ll)y[i]*t%MOD;
  43. }
  44. }
  45. int A[maxn],B[maxn],C[maxn],D[maxn],f[maxn],rev[maxn],a,b,c,d;
  46. int main()
  47. {
  48. int N,K;
  49. f[]=rev[]=;
  50. rep(i,,) f[i]=(ll)f[i-]*i%Mod;
  51. rev[]=qpow(f[],Mod-);
  52. for(int i=;i>=;i--) rev[i]=(ll)rev[i+]*(i+)%Mod;
  53. while(~scanf("%d%d%d%d",&a,&b,&c,&d)){
  54. N=a+b+c+d;
  55. memset(A,,sizeof(A));
  56. memset(B,,sizeof(B));
  57. memset(C,,sizeof(C));
  58. memset(D,,sizeof(D));
  59. rep(i,,a) A[i]=(ll)f[a-]*rev[i-]%Mod*rev[a-i]%Mod*rev[i]%Mod;
  60. rep(i,,b) B[i]=(ll)f[b-]*rev[i-]%Mod*rev[b-i]%Mod*rev[i]%Mod;
  61. rep(i,,c) C[i]=(ll)f[c-]*rev[i-]%Mod*rev[c-i]%Mod*rev[i]%Mod;
  62. rep(i,,d) D[i]=(ll)f[d-]*rev[i-]%Mod*rev[d-i]%Mod*rev[i]%Mod;
  63. int len=; while(len<=N) len<<=;
  64. NTT(A,len,); NTT(B,len,);
  65. rep(i,,len-) A[i]=(ll)A[i]*B[i]%Mod;
  66.  
  67. NTT(C,len,);
  68. rep(i,,len-) A[i]=(ll)A[i]*C[i]%Mod;
  69.  
  70. NTT(D,len,);
  71. rep(i,,len-) A[i]=(ll)A[i]*D[i]%Mod;
  72. NTT(A,len,-);
  73.  
  74. int opt,ans=;
  75. if(N&) opt=; else opt=-;
  76. rep(i,,N) (((ans+=(ll)opt*f[i]*A[i]%Mod)%=Mod)+=Mod)%=Mod,opt=-opt;
  77. printf("%d\n",ans);
  78. }
  79. return ;
  80. }

HDU - 6116:路径计数 (组合数&NTT)的更多相关文章

  1. HDU 6116 路径计数

    HDU 6116 路径计数 普通生成函数常用于处理组合问题,指数生成函数常用于处理排列问题. 考虑 对于 $ a $ 个 $ A $ 分为很多堆,这么分的方案数是 $ C_{a-1}^{i-1} $ ...

  2. 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学

    牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...

  3. 【51nod】1776 路径计数

    [51nod]1776 路径计数 我们先把前两种数给排好,排好之后会有\(a + b + 1\)个空隙可以填数,我们计算有\(k\)个空隙两端都是相同字母的方案数 可以用枚举把第二种数分成几段插进去来 ...

  4. hdu 5868 Polya计数

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  5. 51 nod 1610 路径计数(Moblus+dp)

    1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一 ...

  6. hdu 2865 Polya计数+(矩阵 or 找规律 求C)

    Birthday Toy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  8. 堆优化Dijkstra计算最短路+路径计数

    今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...

  9. 【洛谷】P1176: 路径计数2【递推】

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N),即右下角有多少种方法. 但是这个问题太简单了,所以 ...

  10. hdu 6010 路径交

    hdu 6010 路径交(lca + 线段树) 题意: 给出一棵大小为\(n\)的树和\(m\)条路径,求第\(L\)条路径到第\(R\)条路径的交的路径的长度 思路: 本题的关键就是求路径交 假设存 ...

随机推荐

  1. SqlHelper简单实现(通过Expression和反射)1.引言

    之前老大说要改变代码中充斥着各种Select的Sql语句字符串的情况,让我尝试着做一个简单的SqlHelper,要具有以下功能: 1.不要在业务代码中暴露DataTable或者DataSet类型: 2 ...

  2. 跟着实例学习ZooKeeper的用法: 分布式锁

    锁 分布式的锁全局同步, 这意味着任何一个时间点不会有两个客户端都拥有相同的锁. 可重入锁Shared Reentrant Lock 首先我们先看一个全局可重入的锁. Shared意味着锁是全局可见的 ...

  3. CSS 一个完整的例子

    My first web page What this is A simple page put together using HTML. I said a simple page put toget ...

  4. phoenix部署手册-基于hbase

    背景描述: phoenix基于hbase的SQL层,映射hbase的表,也可以映射视图(VIEW) 部署安装比较简单 映射表和视图的区别: 映射表: 在Phoenix建表错误不易更改: 删除会连同hb ...

  5. windows 下android react native详细安装配置过程

    写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...

  6. javascript-实现简单瀑布流

    直接上代码: <style> *{ margin:0; padding:0; } .waterfall_item{ border:solid 3px #ccc; box-shadow:1p ...

  7. Scala的两种变量

    Scala有两种变量,val和var.val类似于Java的final变量,一旦初始化了,就不能再赋值了.var如同Java中的非final变量,可以在生命周期内被多次赋值.

  8. 403.14-Forbidden Web 服务器被配置为不列出此目录的内容

    第二次碰到这个问题了,记录一下 解决方案:1. 运行->cmd 2. cd  C:\Windows\Microsoft.NET\Framework64\v4.0.30319 3. aspnet_ ...

  9. RENOUNCEMENT

    I must not think of thee;and,tired yet syrong,I shun the thought that lurks in all delight--The thou ...

  10. 提升 CSS 选择器性能的方法

    CSS 选择器性能损耗来自? CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器.而在这之前我们需要了解CSS选择器匹配 ...