GCD XOR, ACM/ICPC Dhaka 2013, UVa12716
不同的枚举方法,效率完全不同。值得记录一下!
1 #include <cstdio> 2 #include <cstring> 3 int t, a, b, c, n, cas = 0, count = 0; 4 int cnt[30000000]; 5 void pre() { 6 count = 0; 7 memset(cnt, 0, sizeof(cnt)); 8 9 for (a = 1; a <= 30000000; a++) { 10 for (c = 1; c < a; c++) { 11 if (a%c == 0 && ((a-c)^a)==c) { 12 count++; 13 } 14 } 15 cnt[a-1] = count; 16 } 17 18 } 19 int main(void) 20 { 21 22 for (scanf("%d", &t); t--;) { 23 scanf("%d", &n); 24 printf("Case %d: %d\n", ++cas, cnt[n-1]); 25 } 26 return 0; 27 }
1 #include <cstdio> 2 #include <cstring> 3 int t, a, b, c, n, cas = 0, count = 0; 4 const int maxn = 30000000; 5 int cnt[maxn]; 6 void pre() { 7 count = 0; 8 memset(cnt, 0, sizeof(cnt)); 9 10 for (c = 1; c <= maxn/2; c++) { 11 for (a = c+c; a <= maxn; a+=c) { 12 if (((a-c)^a)==c) { 13 cnt[a]++; 14 } 15 } 16 } 17 for (int i = 1; i <= maxn; i++) { 18 cnt[i] += cnt[i-1]; 19 } 20 21 } 22 int main(void) 23 { 24 pre(); 25 for (scanf("%d", &t); t--;) { 26 scanf("%d", &n); 27 printf("Case %d: %d\n", ++cas, cnt[n]); 28 } 29 return 0; 30 }