题目链接: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(‘\n‘); } return 0; }
时间: 2024-10-11 16:31:57