zoukankan      html  css  js  c++  java
  • 「刷题笔记」杂题

    C1964B 马克的幸运数

    把所有数按位拆开然后统计所有数中每一位的个数,再排列组合求每列异或后为(1)的方案数,再乘上这一位的贡献((2^n)
    再忘阶乘逆元我喝风油精。

    scanf("%lld",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]),if(a[i]==n)tmp=i;
    for(int i=1;i<=n&&tmp-i>=1;i++)if(a[tmp-i]==n-i)ans++;
    printf("%lld",n-ans);
    

    求排列组合要判断(C^m_n)中是否(ngeq m)

    [HZOI2011]卡农

    简化题意:从一个有 (n) 个元素的集合中选出 (m) 个子集,满足:

    • 每个元素出现次数为偶数
    • 子集非空
    • 子集之间两两不同

    (f_i) 为选 (i) 个子集的答案,那么设已经得到前 (1 o i-1) 个子集的答案,在向 (i) 转移时:

    • 要满足第一条,发现如果前面 (i-1) 个子集确定,那么第 (i) 个集合确定(只要把前面总数为奇数的加上就行了$ ,方案数 (A_{2^n-1}^(n-1)) ,这个时候只保证了第一条满足
    • 要满足第二条,如果存在方案中第 (i) 个为空,那么说明前 (i-1) 个子集是满足条件的(因为所有 (2^n-1) 个子集里只有1个空集可选,既然 (i) 为空那么前面都非空),也就是说多出来的数量为 (f_{i-1})
    • 要满足第三条,如果在选了 (i) 以后发现前面有子集 (j)(i) 相等,那么把这两个子集一起删去,剩下的子集是满足条件的,这时多出来的数量为 (f_{i-2}),注意子集 (i,j) 是不一定的,(i)(2^n-(i-1)) 种,(j)(i-1) 种,因此多出来的总数为 (f_{i-2}*(i-1)*(2^n-i+1))

    综上可以得到转移方程:(f[i]=A_{2^n-1}^{n-1}-f_{i-1}-f_{i-2}*(i-1)*(2^n-i+1))
    先转化题意,再逐个满足,在满足之后的条件时,应该保证前面的条件都被满足,不重不漏地得到答案

  • 相关阅读:
    ES6新语法之---块作用域let/const(2)
    sass变量
    Ruby(或cmd中)输入命令行编译sass
    sass的安装
    鼠标滚动兼容
    HTML5新标签兼容——> <!--<if lt IE 9><!endif-->
    #include stdio.h(7)
    #include stdio.h(6)
    #include stdio.h(5)
    #include stdio.h(3)
  • 原文地址:https://www.cnblogs.com/zzzuozhe-gjy/p/13399494.html
Copyright © 2011-2022 走看看