zoukankan      html  css  js  c++  java
  • HDU 6129

    比赛时脑子一直想着按位卷积...

    按题解的思路:

    /*
    HDU 6129 - Just do it [ 规律,组合数 ]  |  2017 Multi-University Training Contest 7
    题意:
    	给定数组 a[N],一次操作为 a[N] 求前缀异或和,问 M 次操作后的数组
    	限制 M <= 1e9, N <= 2e5
    分析:
    	设 dp[i][j] 为 a[i] 经 j 次操作后的序列
    	易得递推式 dp[i][j] = dp[i-1][j] ^ dp[i][j-1]
    	进一步可推导出 dp[i][j] = dp[i-2^k][j] ^ dp[i][j-2^k]
    	由此可将 m 按二进制拆分后直接做这个dp, 类似完全背包压缩第二维
    */
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e+5;
    int t, n, m, a[N];
    int main()
    {
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%d", &n, &m);
            for (int i = 0; i < n; i++) scanf("%d", &a[i]);
            while (m)
            {
                int x = m&(-m);
                for (int i = x; i < n; i++) a[i] = a[i]^a[i-x];
                m -= x;
            }
            for (int i = 0; i < n-1; i++) printf("%d ", a[i]);
            printf("%d
    ", a[n-1]);
        }
    }
    

     还有一种比较暴力的方法:

     

    /*
    分析第一项对所有项 m 次的贡献系数:
    	C(m-1,m-1)%2 , C(m,m-1)%2, C(m+1,m-1)%2, ... ,C(m+n-1,m-1)%2
    	组合数对二取模根据lucas定理,C(a,b)%2,当 b 按二进制位是 a的子集时 为 1,否则为 0
    	由于 1 很少,更新组合数为 1 的贡献即可
    */
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e5+5;
    int t, n, m, a[N];
    int ans[N];
    int comb(int a, int b)
    {
        if ((a|b) == a) return 1;
        else return 0;
    }
    int main()
    {
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%d", &n, &m);
            for (int i = 0; i < n; i++) scanf("%d", &a[i]);
            memset(ans, 0, sizeof(ans));
            for (int i = 0; i < n; i++)
            {
                if (comb(i+m-1, m-1))
                {
                    for (int j = 0; j+i < n; j++)
                    {
                        ans[j+i] ^= a[j];
                    }
                }
            }
            for (int i = 0; i < n-1; i++) printf("%d ", ans[i]);
            printf("%d
    ", ans[n-1]);
        }
    }
    

      

  • 相关阅读:
    Python制作回合制手游外挂简单教程(中)
    软件工程知识大纲
    Android应用程序开发
    Python制作回合制手游外挂简单教程(上)
    操作系统概念大纲
    Java三种工厂模式
    Java泛型的理解
    Java动态代理的理解
    编译原理与技术大纲
    新服务器sudo与权限分配<NIOT>
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/7373307.html
Copyright © 2011-2022 走看看