uva12716GCD XOR

筛法,打表。

通过打表可知,但gcd(a,b)==a xor b时,a xor b = a-b.

就是求满足 c = a-b且c = a xor b 的c的个数。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 30000000;

int ans[maxn+10];
int a,b,c,n;
int T;

void init() {
    int data=maxn>>1;
    memset(ans,0,sizeof(ans));
    for(int c=1;c<=data;c++)
        for(int a=c*2;a<=maxn;a+=c) {
            b=a-c;
            if((a^b)==c) ans[a]++;
        }
    for(int i=2;i<=maxn;i++) ans[i]+=ans[i-1];
}

int main() {
    init();
    scanf("%d",&T);
    for(int i=1;i<=T;i++) {
        scanf("%d",&n);
        printf("Case %d: %d\n",i,ans[n]);
    }
    return 0;
}
时间: 2024-10-23 15:19:07

uva12716GCD XOR的相关文章

bzoj 2337: [HNOI2011]XOR和路径

Description Input Output Sample Input Sample Output HINT Source Day2 终于把这个史前遗留的坑给填了... 首先异或的话由位无关性,可以按位处理... 那么对于每一位,设f[i]表示从i出发第一次到达n且xor和为1的概率,out[i]为i的出边,那么转移就比较容易了... if(w(i,j)&xxx) f[i]+=(1-f[j)/out[i];// 这条边该位为1,需要xor上0,xor和才为1 else f[i]+=f[j]/

【BZOJ】2337: [HNOI2011]XOR和路径

[算法]期望+高斯消元 [题解]因为异或不能和期望同时运算,所以必须转为加乘 考虑拆位,那么对于边权为1取反,边权为0不变. E(x)表示从x出发到n的路径xor期望. 对于点x,有E(x)=Σ(1-E(y))(边权1)||E(y)(边权0)/t[x]  t[x]为x的度. 那么有n个方程,整体乘上t[x]确保精度,右项E(x)移到左边--方程可以各种变形. 每次计算完后*(1<<k)就是贡献. 逆推的原因在于n不能重复经过,而1能重复经过,所以如果计算"来源"不能计算n,

421. Maximum XOR of Two Numbers in an Array

Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. Could you do this in O(n) runtime? Example: Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum resul

Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E 一看这种区间查询的题目,考虑一下莫队. 如何${O(1)}$的修改和查询呢? 令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和. 那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$ 记一下前缀异或和即可维护. 1 #include<iostream> 2 #include<cstdio> 3 #include&l

Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题是线段树成段更新,但是不能直接更新,不然只能一个数一个数更新.这样只能把每个数存到一个数组中,长度大概是20吧,然后模拟二进制的位操作.仔细一点就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>

HDU5344——数学题——MZL&#39;s xor

MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to know the xor of all (Ai+Aj)(1≤i,j≤n)The xor of an array B is defined as B1 xor B2...xor Bn Input Multiple test cases, the first line contains an integer T(no more than 20

xor异或逻辑操作(辅助完成图形的叠加)

异或操作的作用: 异或 两个不相同,返回true, 两个相同返回false 0 xor 0  = 0 0 xor 1  = 1 1 xor 0  = 1 1 xor 1  = 0 特殊情况, 全0的2*2矩阵,  一个其它矩阵和它xor的话是其本身: 依据 0 xor 0 =  0, 1 xor 0 = 1.   这个其它矩阵值不变. 0   0 0   0 特殊情况, 全1的2*2矩阵,  一个其它矩阵和它xor的话是其相反的值: 依据 0 xor 1 = 1,  1 xor 1 = 0, 

hdu 4825 Xor Sum(trie+贪心)

hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define CLR(a,b) memset((a)

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int