zoukankan      html  css  js  c++  java
  • 2017多校第7场 HDU 6129 Just do it 找规律

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129

    题意:求a序列后m次xor前缀和

    解法:

    手动对1位置对每个位置的贡献打表发现

    第一次 贡献为 1 1 1 1 1 1 1 1 1 1 1

    第二次 贡献为 1 0 1 0 1 0 1 0 1 0 1 0

    第四次 贡献为 1 3个0 1 3个0 1 3个0 1 3个0

    第八次 贡献为 1 7个0 1 7个0 1 7个0 1 7个0

    ...

    这是比赛之后才知道的,看着比赛的时候通过了200+人,被虐记。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int maxn = 2e5+10;
    struct FastIO
    {
        static const int S = 1310720;
        int wpos;
        char wbuf[S];
        FastIO() : wpos(0) {}
        inline int xchar()
        {
            static char buf[S];
            static int len = 0, pos = 0;
            if(pos == len)
                pos = 0, len = fread(buf, 1, S, stdin);
            if(pos == len)
                exit(0);
            return buf[pos ++];
        }
        inline unsigned long long xuint()
        {
            int c = xchar();
            unsigned long long x = 0;
            while(c <= 32)
                c = xchar();
            for(; '0' <= c && c <= '9'; c = xchar())
                x = x * 10 + c - '0';
            return x;
        }
        inline long long xint()
        {
            long long s = 1;
            int c = xchar(), x = 0;
            while(c <= 32)
                c = xchar();
            if(c == '-')
                s = -1, c = xchar();
            for(; '0' <= c && c <= '9'; c = xchar())
                x = x * 10 + c - '0';
            return x * s;
        }
        inline void xstring(char *s)
        {
            int c = xchar();
            while(c <= 32)
                c = xchar();
            for(; c > 32; c = xchar())
                * s++ = c;
            *s = 0;
        }
        inline double xdouble()
        {
            bool sign = 0;
            char ch = xchar();
            double x = 0;
            while(ch <= 32)
                ch = xchar();
            if(ch == '-')
                sign = 1, ch = xchar();
            for(; '0' <= ch && ch <= '9'; ch = xchar())
                x = x * 10 + ch - '0';
            if(ch == '.')
            {
                double tmp = 1;
                ch = xchar();
                for(; ch >= '0' && ch <= '9'; ch = xchar())
                    tmp /= 10.0, x += tmp * (ch - '0');
            }
            if(sign)
                x = -x;
            return x;
        }
        inline void wchar(int x)
        {
            if(wpos == S)
                fwrite(wbuf, 1, S, stdout), wpos = 0;
            wbuf[wpos ++] = x;
        }
        inline void wint(long long x)
        {
            if(x < 0)
                wchar('-'), x = -x;
            char s[24];
            int n = 0;
            while(x || !n)
                s[n ++] = '0' + x % 10, x /= 10;
            while(n--)
                wchar(s[n]);
        }
        inline void wstring(const char *s)
        {
            while(*s)
                wchar(*s++);
        }
        inline void wdouble(double x, int y = 6)
        {
            static long long mul[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000LL, 100000000000LL, 1000000000000LL, 10000000000000LL, 100000000000000LL, 1000000000000000LL, 10000000000000000LL, 100000000000000000LL};
            if(x < -1e-12)
                wchar('-'), x = -x;
            x *= mul[y];
            long long x1 = (long long) floorl(x);
            if(x - floor(x) >= 0.5)
                ++x1;
            long long x2 = x1 / mul[y], x3 = x1 - x2 * mul[y];
            wint(x2);
            if(y > 0)
            {
                wchar('.');
                for(size_t i = 1; i < y && x3 * mul[i] < mul[y]; wchar('0'), ++i);
                wint(x3);
            }
        }
        ~FastIO()
        {
            if(wpos)
                fwrite(wbuf, 1, wpos, stdout), wpos = 0;
        }
    } io;
    
    int a[maxn];
    int main()
    {
        int T,n,m;
        T = io.xint();
        while(T--)
        {
            n = io.xint();
            m = io.xint();
            for(int i=1; i<=n; i++) a[i] = io.xint();
            for(int k=0; (1<<k)<=m; k++){
                if(m&(1<<k)){
                    for(int j=1; j<=n; j++){
                        if((long long)j+(1<<k)>(long long)n) break;
                        a[j+(1<<k)] ^= a[j];
                    }
                }
            }
            for(int i=1; i<n; i++) io.wint(a[i]), io.wchar(' ');
            io.wint(a[n]), io.wchar('
    ');
        }
        return 0;
    }
    
  • 相关阅读:
    C# IL语法
    设计模式学习笔记(1)之单例模式
    设计模式学习笔记(3)之策略设计模式(Strategy)
    ORACLE与SQL SERVER语法区别
    浅谈测试驱动开发(TDD)
    面向对象的5条基本设计原则
    干法读后感磨练灵魂 提升心志
    Linux系统管理之硬盘管理
    Linux硬件信息采集
    Linux iptables
  • 原文地址:https://www.cnblogs.com/spfa/p/7371816.html
Copyright © 2011-2022 走看看