zoukankan      html  css  js  c++  java
  • bzoj4903 [Ctsc2017]吉夫特


    搞了半天这个东西要用 Lucas 定理啊。。。 ![](https://images2018.cnblogs.com/blog/1330366/201806/1330366-20180620090819403-1046591813.png)

    学好这些姿势你就可以A了。。。
    显然:

    [{0 choose 1}=0 {1 choose 1}=1 {1 choose 0}=1 {0 choose 0}=1 ]

    你一直用这个 Lucas 定理,又因为 mod = 2, 实际上就是把两个二进数数挨着挨着一位一位的比较。
    所以你只要在过程中没有 ({0 choose 1}) 就好了。
    在进一步就成了 (n & m = m) 就满足了。
    你 dp 自己枚举一下岂不是很完美?

    
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 234567, mod = 1e9 + 7;
    int n, ans, ini[maxn], lpl[maxn], pw[63];
    
    inline void prepare()
    {
    	pw[1] = 1;
    	for(int i = 2; i <= 20; ++i) pw[i] = pw[i - 1] * 2;
    }
    
    int main()
    {
    	prepare();
    	scanf("%d", &n);
    	for(int i = 1; i <= n; ++i) scanf("%d", &ini[i]);
    	for(int now, i = n; i >= 1; --i){
    		now = ini[i]; lpl[ini[i]] = 1;
    		for(int j = now; j; ){
    			j = (j - 1) & now;
    			lpl[ini[i]] = (lpl[ini[i]] + lpl[j]) % mod;
    		}
    	}
    	for(int i = 1; i <= n; ++i) ans = (ans + lpl[ini[i]]) % mod;
    	cout << ans - n;
    	return 0;
    }
    
    
    心如花木,向阳而生。
  • 相关阅读:
    二叉树前、中、后遍历
    程序员节宜冒泡
    HashMap源码分析
    Stack源码解析
    逆袭之旅DAY24.XIA.二重进阶、双色球
    逆袭之旅DAY24.XIA.数组练习
    LY.JAVA面向对象编程.内部类
    LY.JAVA面向对象编程.修饰符
    LY.JAVA面向对象编程.包的概述、导包
    XIA.人机猜拳
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9202222.html
Copyright © 2011-2022 走看看