uva12716 gcd

题意:给出N,1<=b<=a<=N,求满足gcd(a,b)=a xor b的pair (a,b)的个数

有个重要的结论:若gcd(a,b)=a xor b=c,那么b=a-c

如果一个个求gcd肯定不行。

令f[i]表示满足条件的pair (a,b)中,a=i的个数

枚举c,令a是c的所有倍数,求出b=a-c。若b=a xor c那么f[a]++

最后求f[]的前缀和S[],那么答案就是S[N](要求a<=N啦~)

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define LL long long
 4 #define MX 30000005
 5
 6 int N,T;
 7 LL S[MX],f[MX];
 8
 9 int main()
10 {
11     memset(f,0,sizeof(f));
12     for (int c=1;c<=MX;c++)
13         for (int a=2*c;a<=MX;a+=c)
14         {
15             int b=a-c;
16             if ((a^b)==c)
17             {
18                 //printf("%d %d %d %d\n",a,b,a^b,c);
19                 f[a]++;
20             }
21         }
22
23     S[1]=f[1];
24     for (int i=2;i<=MX;i++)
25     {
26         //printf("%d  ",f[i]);
27         S[i]=S[i-1]+f[i];
28     }
29
30     scanf("%d",&T);
31     for (int times=1;times<=T;times++)
32     {
33         scanf("%d",&N);
34         printf("Case %d: %lld\n",times,S[N]);
35     }
36
37     return 0;
38 }

时间: 2024-10-15 16:22:00

uva12716 gcd的相关文章

UVA12716 GCD XOR 数论数学构造

题目给你一个N,让你求 两个数字 A,B,且   A>=B<=N,是的 gcd(A,B) == A^B N的范围是 3*10^7大的吓人一开始没敢想构造,因为就算构造开的数组也太大了,已经10^7了,后来想了半天在^运算这里也没有想出来什么,所以没办法还是大胆构造吧,构造就去按照他题目的意思来了,构造两个数字 i,j其中j是i的倍数,那么j + i与i的最大公约数肯定是i了,那么(j+i)^i == i这样构造出来的就算满足了,然后再模仿gcd辗转相除的愿意  把它们放在一个数组里计数,这样预

UVA-12716 - GCD XOR

[思路]a^b = c等价于a^c = b  所以枚举a和c,而a和c全部枚举肯定TLE,所以高效算法:通过c是a的约数这个关系来枚举会减小循环,必须要将c放在循环外面,因为c的情况比较少.其实本题就是要求:c=a-b(规律),c=a^b 以下是高神的AC代码,很好很强大: #include <cstdio> #include <iostream> #include <cmath> #include <string> using namespace std;

UVA12716 GCD XOR(枚举)

UVA12716 GCD XOR Description Given an integer N, find how many pairs (A, B) are there such that: gcd(A, B) = A xor B where 1 ≤ B ≤ A ≤ N. Here gcd(A, B) means the greatest common divisor of the numbers A and B. And A xor B is the value of the bitwise

[UVA-12716] GCD XOR 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接(vjudge):https://vjudge.net/problem/UVA-12716 题目大意: 输入一个数字t,表示数据组数. 接下来t行,每行给出一个整数n(1<=n<=30000000),问有多少对整数a,b(1<=b<=a<=n),满足gcd(a,b) = a^b. 对于每个n,输出Case x: y,表示当前是第x组数据,结果是y. Sample Input 2 7 20000000

UVa12716 - GCD XOR

题意 给一个数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> #in

uva12716 GCD XOR(打表找规律+筛法)

题意:输入整数(1=<n<=30000000),有多少对整数(a,b)满足:1=<b=<a=<n,且gcd(a,b)=a^b.例如n=7时,有4对:(3,2),(5,4),(6,4),(7,6) 解题思路: 看到题目之后一直在找最大公约数和异或之间的关系,但找了半天没有发现.于是果断打表发现如下规律 满足gcd(a,b)=a^b的数有如下规律,要么就是a=b-1,要么就是有前面已求得的满足条件的乘上一定的倍数得到如下: 根据上述规律,我们便可以求的所有的可能性,上面只打印了一

约数相关

约数 约数简介 定义: 若整数 n 除以整数 d 的余数为 0,即 d 能整除 n, 则称 d 是 n,的约数,n 是 d 的倍数,记为 d|n 在算术基本定理中 \(N\)可被分解成下面这个样子 \[N=\prod_{i=1}^m p_i^ {c_i}, \ p_1<p_2<-<p_m , \ c_i ∈ N^*\] 那么\(N\)的正约数个数为: \[(c_i+1)*(c_i+2)*-(c_m+1)=\prod_{i=1}^{m}(c^i+1)\] \(N\)的所有正约数和为: \[

例题10-5 GCD等于XOR UVa12716

1.题目描述:点击打开链接 2.解题思路:本题能用的判断条件只有两个:(1)gcd(a,b)=c:(2)(a^b)=c:通过观察容易发现如果gcd(a,b)=(a^b)=c,那么c=a-b,因此可以事先枚举所有a的因数c,利用b=a-c计算b,然后只需验证是否满足(a^b)==c即可.但本题的数据太大,而且枚举约数不容易,因此可以利用约数c枚举倍数a,这样就会方便很多,打表的效率也足够高:而且,由于a=k*c,b=a-c=(k-1)*c,因此,必有gcd(a,b)=gcd(k*c,(k-1)*c

【UVA12716】GCD和XOR

题意 输入整数n(1<=n<=3*107),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b.例如:n=7时,有4对:(3,2),(5,4),(6,4),(7,6) 分析 本题的主要想法就是找到一个沟通gcd(a,b)和a^b的桥梁 a^b≥a-b.口头化证明:假如二进制位上相同,那么都是0,加入二进制位上不同,前者一定是1,后者可能是1(1-0),也有可能借位导致数位减少(0-1) a-b≥gcd(a,b).由九章算术·更相减损术可得gc