最大公约数 与 异或 UVA GCD XOR 数论小技巧记录
2017-07-28 09:25
791 查看
题目:UVA 12716
约定a >= b, (a, b) = c. 那么 c <= (a, b). 应该知道(a, b)意为最大公约数gcd
a ^ b = c === c <= a ^ b,
a 不能等于 b, 反正法:若a= b, a ^ b = 0. 而 (a, b) = a != 0。不会满足题意的。得知 c <= a - b <= a ^ b = c,所以 c = a - b
就下来就是暴力枚举因数c, 和 a.时间复杂度O(nlogn)。一次离线处理即可。
约定a >= b, (a, b) = c. 那么 c <= (a, b). 应该知道(a, b)意为最大公约数gcd
a ^ b = c === c <= a ^ b,
a 不能等于 b, 反正法:若a= b, a ^ b = 0. 而 (a, b) = a != 0。不会满足题意的。得知 c <= a - b <= a ^ b = c,所以 c = a - b
就下来就是暴力枚举因数c, 和 a.时间复杂度O(nlogn)。一次离线处理即可。
#include <iostream> #include <iomanip> #include <cstring> using namespace std; const int maxn = 3e7; long long f[maxn + 1]; void init() { //离线预处理 memset(f, 0, sizeof f); int maxC = maxn / 2; //gcd最大为最大数值的一般对吧 for(int c = 1; c <= maxC; ++c) { //枚举最大公约数 for(int i = 2; i * c <= maxn; ++i) { //枚举因子 int a = i * c; int b = a ^ c; if(a - b == c) { f[a]++; } } } for(int i = 2; i <= maxn; ++i) f[i] += f[i - 1]; } int main() { init();//预处理 int T, kase = 0; cin >> T; while(T--) { int n; cin >> n; cout << "Case " << ++kase << ": " << f << endl; } return 0; }
相关文章推荐
- 【数论】GCD XOR, ACM/ICPC Dhaka 2013, UVa12716 【异或】【好题】
- UVA 12716 GCD XOR (数论 gcd和异或不等式)
- 数论继续学习3--最大公约数gcd和最小公倍数lcm
- GCD XOR UVA - 12716 (gcd(),异或)
- 数论,优化,预处理(GCD 等于 XOR,uva 12716)
- Maximum GCD - UVa 11827 最大公约数 读入有坑
- UVA-1642-MagicalGCD[区间最大公约数]
- UVA 12716 GCD XOR 【数论】【素数】【暴力枚举】
- Uva 12716-GCD XOR(数论,枚举,xor)
- 数论(1):最大公约数和最小公倍数(Gcd&Lcm)
- 51nod 1011最大公约数GCD【数论】
- UVa 12716 && UVaLive 6657 GCD XOR (数论)
- UVA 12716 GCD XOR(数论+枚举+打表)
- FZU 1969 GCD Extreme,UESTC 1723 吴神的大脑: _数论好题(求1-n中所有数的最大公约数之和)
- UVA12716 GCD等于XOR 数论 枚举
- UVA 12716 GCD XOR (异或)
- UVa12716 - GCD XOR(数论数学构造)
- 2013 Asia - Dhaka GCD XOR 数学,gcd ,异或 (uvaLive 6657 - GCD XOR)
- UVA 12716 GCD XOR(数论+枚举+打表)
- Magical GCD UVA 1642 利用约数个数少来优化 给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。