题面描述
求 0~n 中有多少个整数 k 满足 (2 * k) XOR (3 * k) == k, 其中 XOR 为异或操作。
输入数据
输入数据的第一行为一个正整数 T(T<=30) ,表示测试数据的组数。
接下来的 T 行中,每行为一组测试数据,包含一个正整数 n(n<=1000000000) 。
输出数据
对每一组输入数据,输出一行结果 ”Case #id: M” ,表示第 id 组数据的结果是 M , id 从 1 开始。
样例输入
5 |
样例输出
Case #1: 1 |
解题思路
XOR异或运算10000000000(9个0),如果直接枚举,时间肯定会超时,就想到了暴力打表,分阶段AC。基于我们的代码结果是正确的,不妨我们分成10个部分。
int XorForm[51] = {1 , 514229 , 832040 , 1028458 , 1346269 , 1346269 ,
1664080 , 2056916 , 2178309 , 2178309 , 2178309} ;
// 打表长度 0,1(8个0),2(8个0),3(8个0),4(8个0),5(8个0),
// 6(8个0),7(8个0),8(8个0),9(8个0),10(8个0)
即使是这样,代码也会超时。那就再细分一下,我是每个区间细分为5个。如果想要时间更快,建议每个区间分成10个。
// 打表长度 0,1(8个0),2(8个0),3(8个0),4(8个0),5(8个0),6(8个0),7(8个0),8(8个0),9(8个0),10(8个0)
int XorForm[51] = {
1 , 167761 , 271443 , 317811 , 439204 , 514229 ,//0-2-4-6-8-10
514229 , 589254 , 710647 , 832040 , 832040 ,//12-14-16-18-20
832040 , 832040 , 832040 , 953433 , 1028458 ,//22-24-26-28-30
1149851 , 1202984 , 1346269 , 1346269 , 1346269 ,//32-34-36-38-40
1346269 , 1346269 , 1346269 , 1346269 , 1346269 ,//42-44-46-48-50
1346269 , 1392637 , 1542687 , 1640214 , 1664080 ,//52-54-56-58-60
1785473 , 1860498 , 1860498 , 1946469 , 2056916 ,//62-64-66-68-70
2178309 , 2178309 , 2178309 , 2178309 , 2178309 ,//72-74-76-78-80
2178309 , 2178309 , 2178309 , 2178309 , 2178309 ,//82-84-86-88-90
2178309 , 2178309 , 2178309 , 2178309 , 2178309 ,//92-94-96-98-100
} ;
完整程序代码如下