zoukankan      html  css  js  c++  java
  • HDU 6129 Just do it

      题意:给你一个包含n个数的序列A和一个数m,序列B中的数是序列A经过异或得到的,比如:b[i]=a[1]^a[2]^…..^a[i]。现在让你求经过m次异或后,序列B的值。

       思路:这题其实和杨辉三角形有关。

       首先我们打个表可以得到

       

      我们知道杨辉三角形

      我们可以看到一个规律,我们单独把a提出来,每一行便是

      我们斜着看杨辉三角形

      可以发现是相等的,我们就得到结论(i,j)位置的数值等于C(i+j-2, j-1),判断此处的奇偶便好。

    /** @xigua */
    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <stack>
    #include <cstring>
    #include <queue>
    #include <set>
    #include <string>
    #include <map>
    #include <climits>
    #define PI acos(-1)
    using namespace std;
    typedef long long ll;
    typedef double db;
    const int maxn = 2e5 + 5;
    const int mod = 1e9 + 7;
    const int INF = 1e8 + 5;
    const ll inf = 1e15 + 5;
    const db eps = 1e-6;
    int a[maxn], b[maxn];
    
    void solve() {
        int n, m;  scanf("%d%d", &n, &m);
        memset(b, 0, sizeof(b));
        memset(a, 0, sizeof(a));
        for (int i=1; i<=n; i++)  scanf("%d", &a[i]);
        for (int i=1; i<=n; i++) {
            int x=i+m-2, y=i-1;
            if ((x&y)==y) {  //判断奇偶
                for (int j=i; j<=n; j++)
                    b[j]^=a[j-i+1];
            }
        }
        for (int i=1; i<=n; i++) {
            if (i-1)  printf(" ");
            printf("%d", b[i]);
        }
        puts("");
    }
    int main() {
        int t = 1, cas = 1;
        //freopen("in.txt", "r", stdin);
       // freopen("out.txt", "w", stdout);
        scanf("%d", &t);
        while(t--) {
           // printf("Case %d: ", cas++);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    软考下午题具体解释---数据流图设计
    透视表提取不反复记录(4)-每一个物品的最大值
    运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中
    [经验总结]material design效果与开发总结
    cocos2d-x 3.0 回调函数
    P1334 瑞瑞的木板
    P2776 [SDOI2007]小组队列
    P1886 滑动窗口
    P1160 队列安排
    P1823 音乐会的等待
  • 原文地址:https://www.cnblogs.com/gggyt/p/7374212.html
Copyright © 2011-2022 走看看