码迷,mamicode.com
首页 > 其他好文 > 详细

UVa12716 - GCD XOR

时间:2016-09-27 23:20:18      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

题意

给一个数n,找出gcd(a,b) = a^b的个数   (1<=b<=a<=n)。

n的数据范围:1到30000000

思路

c满足gcd(a,b) = a^b,打表观察数据得出c = a - b;又因为c是a的约数,用类似素数筛选的方法降低时间复杂度。

总结

敲代码的时候忘记打表这个东西的存在,只要一次性将所有的结果算出存在数组里,每次提取就可以,不用每次都算一遍。

智障啊_(:з」∠)_为什么想不到,不然又可以A一道题

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <string>
typedef long long LL;
const LL maxn = 30000005;
using namespace std;
LL ans[maxn];
LL T, kase = 0, n;
void solve()
{
    for(int i = 1; i <= maxn; i++)
        for(int j = i+i; j <= maxn; j+=i)
            if((j^(j-i)) == i) ans[j]++;
    for(int i = 2; i <= maxn; i++)
        ans[i] += ans[i-1];
}
int main()
{
    //freopen("in.txt","r",stdin);
    solve();
    cin >> T;
    while(T--) {
        cin >> n;
        cout << "Case " << ++kase << ": " << ans[n] << endl;
    }
    return 0;
}

 

UVa12716 - GCD XOR

标签:

原文地址:http://www.cnblogs.com/md-zz/p/5914556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!