zoukankan      html  css  js  c++  java
  • 【二项式定理】【DFS】UVALive

    题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值。

    一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循环,总共l-1次,直到剩下一个值。问的就是这个值是多少。

    容易发现,一个区间的答案,只和每个数被异或的次数的奇偶性有关。

    而这个被异或的次数恰好是二项展开式的系数。

    组合数的奇偶性这样判断:C(N,M)为奇数的充要条件是(N&M)==M。即M是N的子集。所以在区间长度L确定的前提下,只需dfs搜索L的子集,就能枚举出那些奇数的位置了。

    #include<cstdio>
    using namespace std;
    int T,n,m,a[10005],x,y,len,e,b[35],ans;
    void dfs(int cur,int now){
        ans^=a[x+now];
        for(int i=cur;i<=e;++i){
            dfs(i+1,now|(1<<b[i]));
        }
    }
    int main(){
        //freopen("g.in","r",stdin);
        int zu=0;
        scanf("%d",&T);
        for(;T;--T){
            printf("Case %d:
    ",++zu);
            scanf("%d",&n);
            for(int i=0;i<n;++i){
                scanf("%d",&a[i]);
            }
            scanf("%d",&m);
            for(int i=1;i<=m;++i){
                ans=e=0;
                scanf("%d%d",&x,&y);
                len=y-x;
                for(int j=0;j<31;++j){
                    if((len>>j)&1){
                        b[++e]=j;
                    }
                }
                dfs(1,0);
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7747486.html
Copyright © 2011-2022 走看看