UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD)
题意分析
题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b.
前置技能
XOR的性质
GCD
由于题目只给出一个n,我们要求对数,能做的也始终暴力枚举a,b,这样就有n^2的复杂度,由于n很大,根本过不了。
于是我们就想用到其中一些性质,如XOR 与GCD,不妨假设 a xor b = c,并且根据题意还知道, gcd(a,b) = c,也就说明c一定是a的因子,所以在枚举的时候,可以转过头来枚举a和c.那么如何求出当前情况下的b呢,考虑到xor的性质,即 a xor b = c, a xor c = a xor a xor b = b. 通过异或运算就可以求解出来b,然后再检验gcd(a,b)是否为c即可。
到这里其实已经足够了,但是打出一定规模符合题意的(a,b,c),不难发现,a-b=c,有了这条性质,就可以不用gcd检验了。换句话说,通过枚举a,c,b = a-c计算出b,通过a^b=c检验是否符合条件。因为相对而言,位运算比gcd快得多。
值得一提的是,由于n很大,连续处理多个n很大的值的时候,速度表现不能令人满意,最先想到的办法就是打表方法。
代码总览
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define nmax 30000010
#define ll long long
using namespace std;
int n;
int t;
int num[nmax];
void init(){
for(int c = 1;c<=(nmax+1)/2;++c){
for(int a = c+c;a<nmax;a+=c){
int b = a-c;
if((a^b) == c) num[a]++;
}
}
for(int i = 2;i<nmax;++i) num[i]+=num[i-1];
}
int main()
{
int kase =1 ;
init();
scanf("%d",&t);
for(kase = 1; kase <=t;++kase){
scanf("%d",&n);
printf("Case %d: %d\n",kase,num[n]);
}
return 0;
}
UVA.12716 GCD XOR (暴力枚举 数论GCD)的更多相关文章
- Uva 10167 - Birthday Cake 暴力枚举 随机
Problem G. Birthday Cake Background Lucy and Lily are twins. Today is their birthday. Mother buys ...
- UVA 725 division【暴力枚举】
[题意]:输入正整数n,用0~9这10个数字不重复组成两个五位数abcde和fghij,使得abcde/fghij的商为n,按顺序输出所有结果.如果没有找到则输出“There are no solut ...
- UVa 10603 Fill [暴力枚举、路径搜索]
10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...
- UVA 12716 GCD XOR(数论+枚举+打表)
题意:给你一个N,让你求有多少组A,B, 满足1<= B <= A <= N, 且 gcd(A,B) = A XOR B. 思路:首先我们能够得出两个结论: A-B > ...
- GCD XOR UVA 12716 找规律 给定一个n,找多少对(a,b)满足1<=b<=a<=n,gcd(a,b)=a^b;
/** 题目:GCD XOR UVA 12716 链接:https://vjudge.net/problem/UVA-12716 题意:给定一个n,找多少对(a,b)满足1<=b<=a&l ...
- uval 6657 GCD XOR
GCD XORGiven an integer N, nd how many pairs (A; B) are there such that: gcd(A; B) = A xor B where1 ...
- [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)
题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...
- 题解 UVA12716 GCD等于XOR GCD XOR
规律题,打表找规律即可发现 a xor b >= a - b >= gcd(a, b), 如果 a xor b = gcd(a, b) = c 则 c = a - b 枚举倍数c和a判断b ...
- GCD XOR uvalive6657
GCD XORGiven an integer N, nd how many pairs (A; B) are there such that: gcd(A; B) = A xor B where1 ...
随机推荐
- Tesseract 4 自行构建支持双引擎的tessdata 文件
Tesseract 4 版本具备两种识别引擎:新的基于LSTM(神经网络)引擎与传统引擎.通过在初始化时设定不同的EngineMode启动. OCR Engine modes: 0 Legacy en ...
- oracle数据update后怎么恢复到以前的数据
http://blog.csdn.net/itdada/article/details/52746392
- js最简单的动画
$(document).ready(function(){ //�ֶ�����ҳ��Ԫ�� $("#reset").click(function(){ $("*" ...
- so easy, too happy
一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate • 估计这个任务需要多 ...
- 《JavaScript》forEach()和map()
js中的forEach()方法只能遍历数组,不能遍历字符串和对象,和$.each()有很多使用上的区别array.forEach(funcion(value,index,arr){},thisValu ...
- Task 4.5 求二维数组中的最大连通子数组之和
任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将 ...
- C# 打包
开发环境:VS2010+SQL Server 2008 操作系统:win7_32bit 旗舰版 开发语言:C# 项目名称:学生寄宿管理系统 下面开始介绍:如何给windows应用程序打包? 第一步: ...
- 剑指offer:用两个栈实现队列
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 可以用stack1来存所有入队的数.在出队操作中,首先将stack1中的元素清空,转移到sta ...
- Journal entry of the eleventh chapter to chapter twelfth
第十一章:正如很多人一样,觉得软件工程这个课程好像没什么用,感觉提高不了自己的写代码能力,学的都是理论知识,好像对于我们这种技术类的专业离得有点远,是这样的吗? 第十二章:每样东西都没有完美的,即使我 ...
- Java自学基础用法
在慕课上面简单学习了一下java语言的用法 简单的用法总结记录一下. 代码(学习输入,输出): package hello; import java.util.Scanner; public clas ...