【BestCoder】 HDOJ 5175 Misaki's Kiss again

题意:找出
   
    0
   
   
    N1
   中,有哪些数满足
   
    gcd(N,M)==NxorM
   .
解法:暴力枚举
   
    N
   的所有约数
   
    K
   ,令
   
    M=NxorK
   ,再判断
   
    gcd(N,M)
   是不是等于
   
    K
   。时间
   
    O(sqrt(N))
   ;

#include <iostream>
#include <queue> 
#include <stack> 
#include <map> 
#include <set> 
#include <bitset> 
#include <cstdio> 
#include <algorithm> 
#include <cstring> 
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 200005
#define maxm 4005
#define eps 1e-7
#define mod 1000000007
#define INF 0x3f3f3f3f
#define PI (acos(-1.0))
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid 
#define rson o<<1 | 1, mid+1, R
#define pii pair<int, int>
#pragma comment(linker, "/STACK:16777216")
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;
LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;}
LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}
// head

vector<LL> ans;
LL n;

void work()
{
	ans.clear();
	for(LL i = 1; i * i <= n; i++) {
		if(n % i == 0) {
			LL m = n ^ i;
			if(__gcd(m, n) == i && m >= 1 && m <= n) ans.push_back(m);
			if(i * i != n) {
				m = n ^ (n / i);
				if(__gcd(m, n) == n / i && m >= 1 && m <= n) ans.push_back(m);
			}
		}
	}
	sort(ans.begin(), ans.end());
	printf("%d\n", ans.size());
	for(int i = 0; i < ans.size(); i++) printf("%lld%c", ans[i], i == ans.size() - 1 ? '\n' : ' ');
	if(ans.size() == 0) printf("\n");
}

int main()
{
	int _ = 0;
	while(scanf("%I64d", &n)!=EOF) {
		printf("Case #%d:\n", ++_);
		work();
	}
	

	return 0;
}


你可能感兴趣的:(hdoj,BestCoder)