codeforces C. Magic Formulas 解题报告
题目链接:http://codeforces.com/problemset/problem/424/C
题目意思:给出 n 个数:p1, p2, ..., pn,定义:
q1 = p1 ^ (1 mod 1) ^ (1 mod 2) ^ (1 mod 3) ...^(1 mod n);
q2 = p2 ^ (2 mod 1) ^ (2 mod 2) ^ (2 mod 3) ...^(2 mod n);
...
qn = p3 ^ (n mod 1) ^ (n mod 2) ^ (n mod 3) ...^(n mod n)
Q = q1 ^ q2 ...^ qn
要求算出 Q
很明显,如果直接做绝对是超时的。在这里,非常感谢 yk 师弟不厌其烦地为我解释思路,虽然最后我并没有按他的思路做......
那么,不能直接算就需要从公式中找规律。首先要清楚的是,异或 ^ 运算满足交换律;所以可以先求出 p1 ^ p2 ^ ...^ pn,并且可以先求出第一列异或的结果,再跟第二列求出的异或结果异或...直到跟最后一列的结果异或。其次,假设 n 代表一个非零整数,有3条公式需要知道:(1)0 ^ n = n;(2)n ^ n = 0(可以推广到异或偶数次自身),(3) n ^ n ^ n = n(可以推广到异或奇数次自身)。 这3个公式对后面的的计算进行简化。
假设n = 5。接着请读者打竖看,即 1 mod 1, 2 mod 1, ..., 7 mod 1 地看。很明显这一列 异或之后 是等于0的!那么从第二列开始看: 第三列 第四列 第五列
1 mod 2 = 1 1 mod 3 = 1 1 mod 4 = 1 1 mod 5 = 1
2 mod 2 = 0 2 mod 3 = 2 2 mod 4 = 2 2 mod 5 = 2
3 mod 2 = 1 3 mod 3 = 0 3 mod 4 = 3 3 mod 5 = 3
4 mod 2 = 0 4 mod 3 = 1 4 mod 4 = 0 4 mod 5 = 4
5 mod 2 = 1 5 mod 3 = 2 5 mod 4 = 1 5 mod 5 = 0
观察这些数,可以得出每一列 mod 出来的结果都是比被 mod 数小的:第二列 mod 出来的结果都比 2 小 ; 第三列 mod 出来的结果都比 3 小;...第五列比 5 小。再观察发现,每一列 mod 出来的数是有周期性的。这时需要用到上面所说的后两条公式了。需要知道这些周期究竟是计数还是偶数,如果是偶数,相当于根本没有做过异或操作;否则异或一次。周期数的计算可以用这个公式 (n-n%i)/i 求出 。最后要处理的是最后面的那些不成周期的数究竟是什么,可以用到 n % i 来得出。(i 表示 每列中被mod的数)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std; const int maxn = 1e6;
int num[maxn]; int main()
{
int i, p, n, ans;
num[] = ;
for (i = ; i <= maxn; i++)
num[i] = num[i-] ^ i; // num[1] = 0^1; num[2] = 0^1^2; num[n] = 0^1^2...^n
while (scanf("%d", &n) != EOF)
{
ans = ;
for (i = ; i < n; i++)
{
scanf("%d", &p);
ans ^= p; // 先求出p1^p2^...^pn
}
for (i = ; i <= n; i++)
{
int tmp = n - n % i;
if ((tmp/i) & ) // tmp/i 表示有多少个周期数
ans ^= num[i-];
ans ^= num[n%i]; // 不成周期数的独立处理
}
printf("%d\n", ans);
}
return ;
}
codeforces C. Magic Formulas 解题报告的更多相关文章
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- Codeforces Round #277.5 解题报告
又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...
- codeforces B. Simple Molecules 解题报告
题目链接:http://codeforces.com/problemset/problem/344/B 题目意思:这句话是解题的关键: The number of bonds of an atom i ...
- 【LeetCode】676. Implement Magic Dictionary 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 汉明间距 日期 题目地址:https://le ...
- codeforces 591A. Wizards' Duel 解题报告
题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be ...
- codeforces 582A. GCD Table 解题报告
题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...
- codeforces 581C. Developing Skills 解题报告
题目链接:http://codeforces.com/problemset/problem/581/C 题目意思:给出 n 个数:a1, a2, ..., an (0 ≤ ai ≤ 100).给出值 ...
- codeforces 577B. Modulo Sum 解题报告
题目链接:http://codeforces.com/problemset/problem/577/B 题目意思:就是给出 n 个数(a1, a2, ..., an) 和 m,问能不能从这 n 个数中 ...
随机推荐
- 湘潭大学oj 1206 Dormitory's Elevator dp
27153 njczy2010 1206 Accepted 1976 KB 234 MS G++ 1415 B 2014-09-28 10:01:23 真是吐血ac,,,,这么easy的题..... ...
- ORACLE RMAN增量备份经典理解
http://blog.itpub.net/26118480/viewspace-1793548/
- solus系统配置
#更新软件源 清华稳定源 sudo eopkg ar Tuna https://mirrors.tuna.tsinghua.edu.cn/solus/shannon/eopkg-index.xml 清 ...
- Java对象的死亡
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象). 一,引用计数算法 给 ...
- Spring MVC集成Spring Data Reids和Spring Session实现Session共享出现:No bean named 'springSessionRepositoryFilter' available
出现这个问题:No bean named 'springSessionRepositoryFilter' available的的原因: 1.Spring MVC加载了多个配置文件导致的,并不是版本问题 ...
- HDU1800 Flying to the Mars 【贪心】
Flying to the Mars Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- cms完整视频教程+源码 孔浩老师 全131讲
话不多说,请看如下链接, 项目在此文件夹目录下: JAVA专区>3.深入Java Web>3.1.cms项目 很多反馈说无效 本次 2016.09.12 发布最新链接 链接:https ...
- c++中c_str()函数
https://zhidao.baidu.com/question/104592558.html
- [WASM] Set up wasm-bindgen for easy Rust/JavaScript Interoperability
Interoperability between JavaScript and Rust is limited to numerics and accessing memory directly. S ...
- C#获取电脑的相关信息
/* 创建者:菜刀居士的博客 * 创建日期: 2014年08月31号 * 功能:获取电脑的相关信息 * */ namespace Net.String.ConsoleApplication { ...