UVA 12716 GCD XOR (數論 gcd和異或不等式)
GCD XOR
題目連結:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4454
題目大意:求gcd(a, b) = a ^ b且滿足1 <= b <= a <= N的(a, b)對數,其中N小於等於3e7
樣例:
SampleInput
2
7
20000000
SampleOutput
Case 1: 4
Case 2: 34866117
題目分析:首先若a == b則顯然gcd(a, b) != a ^ b,在b < a時考慮兩個不等式:
1. gcd(a, b) <= a - b,這個不用解釋了
2. a ^ b >= a - b,設a >= b把a,b化成二進位制,假設ai位為0,對應的bi位為1,則交換它們,異或值不會變化,但是a - b變大了,因此把所有對應位置中ai與bi不同的位置處令ai為1,bi為0,則得到a ^ b == a - b,其餘的a ^ b顯然都是大於a - b的,因此結論成立
又因為a ^ b = c => a ^ c = b,這個好證:a ^ b = c => a ^ a ^ b = a ^ c => b = a ^ c
由以上推論可得若gcd(a, b) = a ^ b則a ^ b = a - b 且 gcd(a, b) = a - b,因此a - b是a的約數,因此可以列舉a-b的值,用篩子得到a,再判斷是否有a ^ b = a - b即可,預處理前n個數的(a, b)對數,O(1)查詢
#include <cstdio>
int const MAX = 30000005;
int ans[MAX];
void pre()
{
for(int i = 1; i < MAX; i++) // i 即 a - b
{
for(int j = i + i; j < MAX; j += i) // j 即 a
if((j ^ (j - i)) == i) // 判斷是否有 a ^ b == a - b
ans[j] ++;
ans[i] += ans[i - 1];
}
}
int main()
{
pre();
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
int n;
scanf("%d", &n);
printf("Case %d: %d\n", ca, ans[n]);
}
}
相關文章
- 分數的GCD和LCMGC
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- iOS GCD入門和GCD對CPU多核的使用iOSGC
- GCD Inside: GCD 宏GCIDE
- 最大公約數GCDGC
- GCDGC
- FZU 1969 && UVA 11426 GCD Extreme (尤拉函式 或 莫比烏斯反演)GCREM函式
- 異或運算 XOR 教程
- GCD SUMGC
- GCD QueriesGC
- GCD Inside: GCD 資料結構GCIDE資料結構
- codechef Dynamic GCD [樹鏈剖分 gcd]GC
- 奇怪的GCDGC
- 巧談 GCDGC
- 巧談GCDGC
- GCD那些事GC
- iOS GCD吹水iOSGC
- gcd與exgcdGC
- GCD CountingGC
- HDU 4497GCD and LCM(素數分解)GC
- gcd思維_cfECR107_B. GCD LengthGC
- GCD 原理詳解GC
- GCD 死鎖原因GC
- USACO GCD Extreme(II)GCREM
- GCD的基本使用GC
- 深入理解 GCDGC
- 【iOS】玩轉 - GCDiOSGC
- iOS GCD詳解iOSGC
- GCD簡單使用GC
- hdu 1695 GCDGC
- P2568 GCDGC
- ZOJ 4846 GCD Reduce (數學分析題)GC
- HDU 4497 GCD and LCM(拆素數+組合)GC
- HDU 2582 f(n) (組合數的gcd)GC
- GCD之佇列的實現和使用GC佇列
- HDU44979 GCD and LCM (素因子分解+計數)GC
- 又見GCD hd 2504GC
- GCD 中Group的使用GC