HDU 5175 Misakis Kiss again (异或运算,公式变形)

题目连接:?pid=5175题目大意:找到满足gcd(N,M)==NxorM的M值(1<=M<=N)题目分析:令M = N xor K,原式:gcd(N,N xor K) == N xor (N xor K) == K,由此我们可以发现K是N的约数,找到所有N的约数,,判断是不是满足那个等式即可,因为是异或运算,结果可能比约数本身大,如1xor2==3,还有异或出来结果等于0的舍掉(它本身)gcd(n,n) != nxorn,还有就是0的时候多输出一个空行,不然pe#include <cstdio>#include <cmath>#define ll long longint const MAX = 1e5;ll fac[MAX], ans[MAX];ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a; }int main(){int ca = 1;ll n;while(scanf("%I64d", &n) != EOF){int cnt1 = 0, cnt2 = 0;ll tmp = sqrt(n);for(ll i = 1; i <= tmp; i++)if(n % i == 0)fac[cnt1++] = i;for(ll i = tmp; i >= 1; i–)if(n % i == 0 && i != 1)fac[cnt1++] = n / i;for(int i = cnt1 – 1; i >= 0; i–)if(fac[i] == gcd(n, n^fac[i]) && (n^fac[i]) != 0 && (n^fac[i]) <= n)ans[cnt2++] = (n^fac[i]);printf("Case #%d:\n%d\n", ca++, cnt2);if(cnt2 == 0)printf("\n");for(int i = 0; i < cnt2; i++){if(i != cnt2 – 1)printf("%I64d ", ans[i]);elseprintf("%I64d\n", ans[i]);}} }

把你的脸迎向阳光,那就不会有阴影

HDU 5175 Misakis Kiss again (异或运算,公式变形)

相关文章:

你感兴趣的文章:

标签云: