Fork me on GitHub

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 }
View Code

 

 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 }
View Code

 

posted @ 2016-08-09 22:51  赵裕(vimerzhao)  阅读(147)  评论(0编辑  收藏  举报