http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve

Solve

CH Round #64 - MFOI杯水题欢乐赛 day1

题目描述

给定 n 和 X0,X1,...,Xn-1,求解 Y0,Y1,...,Yn-1,其中:

f(x) 等于把 x 写成二进制后 1 的个数,比如说:

f(0)=0 , f(1)=1 , f(4)=1 , f(7)=3

其中  表示二进制下的按位异或运算。

请依次输出 Y0,Y1,...,Yn-1 对  取模的结果。

输入格式

输入第一行为一个正整数 n

输入第二行为 n 个非负整数,第 i 个数表示 Xi-1

输出格式

输出仅一行 n 个非负整数,第 i 个数表示 Yi-1 对  取模的结果。

样例输入

3

1 1 1

样例输出

2 3 3

数据范围及约定

测试数据点 n Xi 特殊性质
1 <= 10 <= 10
2 <= 100 <= 100
3 <= 1000 <= 1000
4 = 65536 <= 109 所有 Ai 都相同
5 <= 105 <= 109 所有 Ai 都相同
6,7,8,9,10 <= 105 <= 109

分析:

方法1,

  可以先预处理W[j][0/1] 表示第j位是0/1的i的i的Xi值和,然后对于每位i,根据其二进制表示来累加答案即可。

  时间复杂度O(n log n) , 可以拿下全部测试点。

方法2.

考虑把n增加为2的幂,并令新增加的数字为0.

然后先把n == 2时转移矩阵写出来:

0 1
1 0

可以发现矩阵大概是这样的;

A A + T
A + T A

其中A的边长为2的幂,T为全1矩阵。

如果对于所有的边长为2的幂的矩阵,都能像这样分解的话,那么是不是就可以分治了?

首先,对于2 * 2 的矩阵来说,很显然是满足条件的。

假设对于2^k * 2 ^k的矩阵来说是满足条件的,那么考虑2 ^(k + 1) * 2 ^(k + 1)的矩阵,其左上角就是原来的2^k * 2 ^k的那个矩阵,设为A,显然对于所有的0 <= i < 2^k和0 <=j < 2 ^k,都有:

f((i+2k)⊕j)=f(i⊕j)+1

是不是说明其左上角的矩阵等于A + T ?

同理:右上角和右下角也是满足条件的。

于是就可以分治的去做了。

时间复杂度:O(n log n),可以拿下所有测试点。

AC代码:

代码很严谨,包括每个字符。。。orz

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define N 100000 + 5
#define Mod 1000000007 int n, W[][]; inline int getint()
{
char ch = '\n';
for (; ch != '-' && (ch > '' || ch < ''); ch = getchar()) ;
int f = ch == '-' ? - : ;
int res = ch == '-' ? : ch - '';
for (ch = getchar(); ch >= '' && ch <= ''; ch = getchar())
res = (res << ) + (res << ) + ch - '';
return res * f;
} inline int Inc(int a, int b)
{
return a + b - (a + b >= Mod ? Mod : );
} int main()
{
//#ifndef ONLINE_JUDGE
// freopen("solve.in", "r", stdin);
// freopen("solve.out", "w", stdout);
// #endif n = getint();
int d = (int) log2(n);
for (int i = ; i < n; i ++)
{
int t = getint();
for (int j = ; j <= d; j ++)
W[j][((i >> j) & )] = Inc(W[j][((i >> j) & )], t);
}
for (int i = ; i < n; i ++)
{
int res = ;
for (int j = ; j <= d; j ++)
res = Inc(res, W[j][((i >> j) + ) & ]);
printf("%d%c", res, (i == n - ) ? '\n' : ' ');
} // #ifndef ONLINE_JUDGE
// fclose(stdin);
// fclose(stdout);
// #endif
return ;
}

contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve的更多相关文章

  1. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

  2. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  3. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  4. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  5. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)

    A.珠 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20(NOIP模拟赛Day1)/珠 题解:sb题, ...

  6. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  7. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)(被虐瞎)

    http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20%28NOIP%E6%A8%A1%E6%8B%9F%E8%B ...

  8. CH Round #59 - OrzCC杯NOIP模拟赛day1

    第一题:队爷的新书 题意简述:给定n个闭区间,求出一个数p使它与包含它的区间数的积最大,输出这个积. 分析:使用一个差分数组g,每个区间[l,r],l位置加1,r+1的位置减1,从前往后统计,得到对于 ...

  9. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

随机推荐

  1. 在Delphi下,如何使ShowMessage中的按钮中文化

    如果你使用messagedlg(对showmessage也适用)可以汉化定义按钮caption的常量,具体操作步骤如下: 1.   打开文件consts.pas(在Delphi安装目录的/source ...

  2. 使用Nginx在自己的电脑上实现负载均衡

    我其实早就想弄这个负载均衡了,但是总觉得这玩意肯定不简单,今天星期六闲着没事终于下定决心来搞一搞他了,但是没想到这玩意这么简单,真的是出乎我的意料的简单(我现在陪的是最简单的那种).额是没有我想象中的 ...

  3. php--如何解决网站分页导致的SEO问题

    如何解决网站分页导致的SEO问题 分页(pagination)是一种自动分页机制,可以将移动Web窗体中的内容分割成一组组较小的页进行呈现,以适合于特定的设备,该机制还呈现可用于浏览到其他页的用户界面 ...

  4. PE文件格式图示

  5. 让Eclipse不格式化数组或某段代码

    用过eclipse ctrl+shit+f的人肯定都感觉eclipse这个功能很爽. 但对于数组,有时候就不是这样了. 比如在opengl中定义一些顶点信息: int one = 0x010000; ...

  6. Ubuntu 12.04+DarwinStreamingSrvr6.0.3 架设流媒体服务器

    1.安装Ubuntu 12.04操作系统,网上很多教程.. 2.打开终端,下载darwin源代码DarwinStreamingSrvr6.0.3-Source.tar,补丁patch dss-6.0. ...

  7. NuGet的几个小技巧

    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...

  8. 【C++】字符串的大小写转换

    #include<string> #include<algorithm> #include<iostream> using namespace std; int m ...

  9. http://blog.csdn.net/yaerfeng/article/details/27683813

    http://blog.csdn.net/yaerfeng/article/details/27683813

  10. RedHat6.6安装Oracle11gR2

    RedHat6.6安装Oracle11gR2 一.Centos6.6的安装配置 1-       选择安装模式 2-       选择“skip”,跳过检查. 3-       选择“下一步” 4-  ...